java堆是java应用程序最密切的内存空间。
差点儿全部的对象都存在堆中。java堆全然自己主动化管理,通过垃圾回收机制,垃圾对象会自己主动清理。不须要显式释放。
依据java垃圾回收机制的不同。java堆可能有不同的结构。
最常见的是将整个java堆分为新生代和老年代。跟人类几乎相同了。老龄化就有可能找上帝去了,新生代存放新对象或者年龄不大的对象,老年代存放老年对象。新生代有可能分为eden区、s0区和s1区,s0区和s1区也被称之为 from 到to区域。他们是两块大小相等能够互换的内存空间例如以下图所看到的:
在大多数情况下。对象首先被分配在eden区,再一次新生代回收后,假设对象还存在,则会进入s0或者s1,之后没经过一个新生代回收,年龄+1.当对象年龄达到一定条件后,就会老龄化进入老年代。
以下一个简单的实例展示java堆、java方法区、java栈之间的关系。代码例如以下:
package cn.xhgg.test; public class HeapTest { private int id; public HeapTest(int id) { this.id = id; } public void show() { System.out.println("id: "+id); } public static void main(String[] args) { HeapTest h1 = new HeapTest(1); HeapTest h2 = new HeapTest(3); h1.show(); h2.show(); } }
HeapTest 实例引用类型肯定分配在堆中、h1、h2局部变量存放在java栈中、并指向堆中的两个实例。
例如以下图所看到的:
时间: 2024-10-10 07:35:36