上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
2.3 对象去哪儿:辨清Java堆
Java堆是和Java应用程序关系最为密切的内存空间,几乎所有的对象都存放在堆中,并且Java堆是完全自动化管理的,通过垃圾回收机制,垃圾对象会被自动清理,而不需要显式地释放。
根据垃圾回收机制的不同,Java堆有可能拥有不同的结构。最为常见的一种构成是将整个Java堆分为新生代和老年代。其中,新生代存放新生对象或者年龄不大的对象,老年代则存放老年对象。新生代有可能分为eden、s0、s1,其中s0和s1也被称为from和to区域,它们是两块大小相等、可以互换角色的内存空间。详细信息可以参阅第4章。
图2.3显示了一个堆空间的一般结构。
图2.3 堆空间的一般结构
在绝大多数情况下,对象首先在eden区分配,在一次新生代回收后,如果对象还存活,则会进入s0或者s1,之后,每经过一次新生代回收,对象如果存活,它的年龄就会加1。当对象的年龄达到一定条件后,就会被认为是老年对象,从而进入老年代。
【示例2-2】下面通过一个简单的示例,来展示Java堆、方法区和Java栈之间的关系。
上述代码声明了一个SimpleHeap类,并在main()函数中创建了两个SimpleHeap实例,此时,各对象和局部变量的存放如图2.4所示。SimpleHeap实例本身在堆中分配,描述SimpleHeap类的信息存放在方法区,main()函数中s1和s2局部变量存放在Java栈中,并指向堆中的两个实例。
图2.4 堆、方法区、栈的关系