JVM进行垃圾回收GC的过程

在JVM的堆内存中,被分为了年轻代young generation和老年代old generation。其中年轻代又被分为Eden区和survivor区,而survivor区又被分为大小相等的2个区,分别称为S1区和S2区。

当程序需要在堆上分配内存时,会首先在eden区进行分配。

当eden区内存已满无法再分配对象时,会触发第一次minor gc,将eden区存活的对象拷贝到其中一个survivor区,比如S1,并把eden区的内存清空,以备使用。

当eden区的内存再次被使用完时,会触发第二次minor gc,将eden区和S1区中存活的对象拷贝到S2区,并将eden区和S1区的内存清空以备使用。在有的书中会提到from区和to区,其实from区和to区是相对而言的,当把S1区的内容拷贝到S2区时,S1为from区,S2为to区。而将S2区的内容拷贝到S1时,S2为from区,S1为to区。

当eden区的内存再次被用完时,会触发第三次minor gc,将eden区和S2区存活的对象拷贝到S1区,并清空eden区和S2区的内存,以备使用。

上述过程循环往复。

当某个对象经历了一次minor gc并且存活下来,没有被清理掉,则说这个对象长大了一岁。当某个对象的年龄大于一定阈值,通常是15岁时,该对象在下次minor gc时会被放到老年代中。

当老年代中的内存不够用时,会触发full gc。

你可能感兴趣的:(架构设计)