JVM的GC操作流程

着急的小伙伴可以直接看总结: 

作者总结:如果Eden区没位置就调用一次minorGC(年轻代GC),如果还是没有位置,那么就往Survior区放,Survior区也没位置就放在Tenured区,Tenured区没位置就调用MajorGC(老年代GC),如果还是没位置就会报OOM异常。


对于总结有疑问的,以下为GC流程的细节:

1、当使用关键字new创建了一个新的对象时,JVM会将新对象保存在Eden区,但是此时需要判断Eden区是否有剩余空间,如果有则直接将新建对象保存在Eden区内,如果没有则会执行“Minor GC”(年轻代GC)

2、在执行完“Minor GC”之后会清除掉不活跃的对象,从而释放Eden区内的内存空间,随后会对Eden空间进行再次判断,如果此时剩余空间可以直接容纳新对象,则会直接为新对象申请内存空间,如果此时Eden空间依然不足,则会将部分活跃对象保存在survivor区。

3、由于Survivor区也有对象会存储在内,所以保存Eden区发送来的对象首先需要判断其空间是否充足,如果Survivor有足够的空余空间,则直接保存Eden区晋升上来的对象,那么此时Eden区将得到空间释放,随后可以在Eden区为新的对象申请内存空间的开辟,如果Survivor区空间不足,则就需要将Survivor区的部分活跃对象保存到Tenured区

4、Tenured区如果有足够的内存空间,则会将Survivor区发送来的对象进行保存,如果此时Tenured区的内存空间也已经满了,则将执行“Major GC”( 相当于使用 “Runtime.getRuntime().gc()” 处理 )以释放老年代中保存的不活跃的对象,如果在释放后有足够的内存空间,则会将Survivor发送来的对象保存,从而Survivor将保存Eden发送来的对象,这样就可以在Eden区内有足够的内存保存新的对象。

5、如果此时老年代的内存区也已经被占满,则会抛出 “OutOfMemoryError”(OOM异常),程序将中断运行

你可能感兴趣的:(jvm,java,算法,gc)