垃圾回收 方面的知识,今天我们再次深入 核心,详细介绍一下
在内存分配方面的知识。一般 在内存分配时会涉及到以下区域:
寄存器:我们在程序中无法控制
栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆
中
堆:存放用 产生的数据
静态域:存放在对象中用 定义的静态成员
常量池:存放常量
非 存储:硬盘等永久存储空间
Java 内存分配中的栈
在函数中定义的一些基本类型的变量数据和对象的引用变量都在函数的栈内存中分配。
当在一段代码块定义一个变量时, 就在栈中 为这个变量分配内存空间,当该变量退
出该作用域后, 会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另
作他用。
Java 内存分配中的堆
堆内存用来存放由 创建的对象和数组。 在堆中分配的内存,由 虚拟机的自
动垃圾回收器来管理。
在堆中产生了一个数组或对象后,还可以 在栈中定义一个特殊的变量,让栈中这个变
量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用
变量。 引用变量就相当于是 为数组或对象起的一个名称,以后就可以在程序中使用栈中
的引用变量来访问堆中的数组或对象。引用变量就相当于是为数组或者对象起的一个名称。
引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后
被释放。而数组和对象本身在堆中分配,即使程序 运行到使用 产生数组或者对象的
语句所在的代码块之外,数组和对象本身占据的内存不会被释放,数组和对象在没有引用
变量指向它的时候,才变为垃圾,不能在被使用,但仍 然占据内存空间不放,在随后的一
个不确定的时间被垃圾回收器收走(释放掉)。这也是 比较占内存的原因。
实际上,栈中的变量指向堆内存中的变量,这就是 中的指针!
常量池 (constant pool)
常量池指的是在编译期被确定,并被保存在已编译的 文件中的一些数据。除了
包含代码中所定义的各种基本类型(如 、 等等)和对象型(如 及数组)的
常量值还包含一些以文本形式出现的符号引用,比如:
类和接口的全限定名;