Java对象内存分配
Java在运行时,会对对象的不同部分进行内存分配,这里进行一个简单的分析。
- 寄存器
寄存器作为计算机中I/O操作最快的内存区域,弊端是容量很小,因此开发者不能直接控制寄存器,Java程序开发中也不会在这上面进行操作。
- 堆栈(stack)
平常就称其为堆,位于RAM中,但通过堆栈指针可以直接获取变量引用,堆栈指针如果向下移动,则会分配新的内存,如果向上移动,则会释放那些内存(速度仅次于寄存器)。创建Java程序时,Java系统知道所有项的生命周期,以便于指针的上下移动。
类似于
String str = null;
中的str变量将会存储与堆栈中
- 堆(heap)
用于存放所有的Java对象
new String();
根据如何确定JVM堆中哪些对象是可以被回收的一文中分享
垃圾回收器在对堆进行回收之前,需要确定堆中哪些对象是可以继续存活的,哪些是可以被回收的,Java采用可达性分析算法来判定对象是否可以继续存活。
这个算法的过程是通过一系列的称为“GC Roots”的对象作为起点,从这些起始点开始向下搜索,搜索过程中所有走过的路径称为引用链,当一个对象和引用链没任何连接的时候,则表明这个对象是可以被回收的。
当在执行堆中的对象代码的时候,Java会在堆中自动进行存储分配。(显然,在堆中执行操作将会比在堆栈中花费更多的时间)
- 常量存储
一个基本的例子是字符串对象中,常常会提到常量池这个概念,类似于
String str = "abc";
这样的字面量,"abc"将会存储在常量池中(直接存储在程序内部,永远不被改变)。
- 非RAM存储
一个基本的例子是I/O流操作,将Java程序中在内存中操作的数据通过流传输到硬盘上,进行永久性存储。
对象利用结束后的清理工作
Java在对象利用之后,会对已经废弃的对象进行垃圾回收,这个过程通过GC(Garbage Collection)机制进行,无需程序员手动管理,但是除开 new 的对象,还有一块特殊的内存区,对于它们,程序员可以用 finalize()
方法,在GC之前,Java会先执行它,因此程序员可以在GC前做一些预备工作。