Java内存结构及分区

188 阅读1分钟

image.png

堆详细讲解

image.png

几个要点:

第一,堆区分了新生代和老年代;

第二,新生代又分为:Eden空间、From Survivor(S0)空间、To Survivor(S1)空间。

第三,堆的GC操作采用分代收集算法。新生代采用复制算法,老年代采用标记整理算法

在GC回收过程中,当新生代区满时,还存活的对象会被复制到其中一个Survivor区;当回收时,会将新生代区和使用的Survivor区还存活的对象,复制到另外一个Survivor区,然后对新生代区和用过的Survivor区进行清理。

如果另外一个Survivor区没有足够的内存存储时,则会进入老年代。

这里针对哪些对象会进入老年代有这样的机制:对象每经历一次复制,年龄加1,达到晋升年龄阈值后,转移到老年代。

在这整个过程中,由于新生代区中的对象属于像浮萍一样“瞬生瞬灭”的对象,所以并不需要1:1的比例来分配内存,而是采用了8:1:1的比例来分配。

历经多次清理依旧存活的对象,则会进入老年代,而老年代清理算法则采用的“标记整理算法”。