Java中的堆空间是用于存放对象实例的内存区域,它可以被划分为几个不同的区域。在Java虚拟机中,堆空间主要被划分为新生代和老年代两部分,其中新生代又被划分为Eden区、Survivor区1和Survivor区2。
新生代是存放新生成的对象实例的区域,一般情况下,大部分对象实例都是在新生代中创建的。而老年代则是存放经过多次垃圾回收仍然存活的对象实例的区域。这种分代的设计有助于提高垃圾回收的效率,因为不同代的对象在生命周期长短和存活率上存在明显的差异,可以根据不同的特点采用不同的回收策略。
在新生代中,Eden区是用来存放新创建的对象实例的地方,当Eden区满了之后,会触发一次Minor GC(新生代垃圾回收)。在Minor GC 中,存活的对象会被移动到Survivor区1中,如果Survivor区1也满了,那么剩余的存活对象就会被移动到Survivor区2中。经过多次Minor GC 后,仍然存活的对象会被移动到老年代中。
下面我们通过代码示例来演示Java堆空间中这几个区的关系:
public class HeapSpaceDemo {
public static void main(String[] args) {
byte[] array1 = new byte[1024 * 1024];
byte[] array2 = new byte[1024 * 1024 * 2];
byte[] array3 = new byte[1024 * 1024 * 3];
}
}
在上面的代码中,我们创建了三个不同大小的数组对象,分别占用1MB、2MB和3MB的空间。这些对象实例会被存放在堆空间的不同区域中,根据它们的大小和存活情况,可能会被移动到不同的区域。
根据我们之前的讨论,可以通过以下关系图来表示堆空间的分区情况:
erDiagram
NEW_GEN {
rectangle Eden
rectangle "Survivor 1"
rectangle "Survivor 2"
}
OLD_GEN {
rectangle Old
}
NEW_GEN ||--|| OLD_GEN
在上面的关系图中,我们可以看到新生代包括Eden区、Survivor区1和Survivor区2,而老年代包括Old区。新生代和老年代之间通过箭头连接表示对象实例在不同区域之间的移动关系。
综上所述,Java堆空间被划分为新生代和老年代两部分,新生代中又包括Eden区、Survivor区1和Survivor区2。这种分代的设计有助于提高垃圾回收的效率,使得对象的分配和回收更加高效。通过代码示例和关系图的演示,我们可以更好地理解Java堆空间中这几个区域的关系和作用。
















