JVM GC原理

了解JVM GC原理非常重要,对于系统调优非常有用。如果一个系统频繁发生FULL GC,那么会造成系统响应卡顿,更严重的时候会导致系统崩溃。

JVM的内存空间,从大的层面上来分析包含:新生代(Young)和老年代(Old)

第一次GC:

在不断创建对象的过程中,当Eden区域被占满,此时会开始做Young GC也叫Minor GC

1)第一次GC时Survivous中S0区和S1区都为空,将其中一个作为To Survivous(用来存储Eden区域执行GC后不能被回收的对象)。比如:将S0作为To Survivous,则S1为From Survivous。

2)将Eden区域经过GC不能被回收的对象存储到To Survivous(S0)区域(此时Eden区域的内存会在垃圾回收的过程中全部释放),但如果To Survivous(S0)被占满了,Eden中剩下不能被回收对象只能存放到Old区域。

3)将Eden区域空间清空,此时From Survivous区域(S1)也是空的。

4)S0与S1互相切换标签,S0为From Survivous,S1为To Survivous。

第二次GC:

当第二次Eden区域被占满时,此时开始做GC

1)将Eden和From Survivous(S0)中经过GC未被回收的对象迁移到To Survivous(S1),如果To Survious(S1)区放不下,将剩下的不能回收对象放入Old区域;

2)将Eden区域空间和From Survivous(S0)区域空间清空;

3)S0与S1互相切换标签,S0为To Survivous,S1为From Survivous。


第三次,第四次一次类推,始终保证S0和S1有一个空的,用来存储临时对象,用于交换空间的目的。反反复复多次没有被淘汰的对象,将会被放入Old区域中,默认15次。

猜你喜欢

转载自www.cnblogs.com/yy3b2007com/p/10975870.html