Minor GC和Full GC和内存分配策略

1.Minor GC和Full GC

Minor GC:发生在新生代上,因为新生代对象存活时间很短,因此Minor GC会频繁执行,执行的速度一般也比较快

Full GC:发生在老生代上,老生代对象存活时间长,因此Full GC很少执行

2.内存分配策略

(一)大多数情况下,对象优先在Eden区分配,当Eden区不够时,发起Minor GC

(二)大对象直接进入老年代  -XX:PretenureSizeThreshold,大于此值的对象直接在老年代分配避免在Eden和Survivor区之间大量内存复制

(三)长期存活的对象进入老年代

(四)动态对象年龄判定:如果Survivor区中相同年龄所有对象大小的总和大于Survivor空间的一半,则年龄大于或等于该年龄的对象直接进入老年代

(五)空间分配担保:在发生Minor GC之前,虚拟机先检查老年代最大可用的连续空间是否大于新生代所有对象总空间,如果条件成立的话,那么Minor GC确认是安全的;

如果不成立的话虚拟机就会检查HandlePromotionFailure设置值是否允许担保失败,如果允许就会继续检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果大于,将尝试进行着一次Minor GC,尽管这次Minor GC是有风险的,可能触发Full GC

如果小于或者HandlePromotionFailure设置不允许冒险,这时改为进行一次Full GC

Full GC的触发条件:

Minor GC触发条件较为简单,Eden区空间慢时,就将会触发一次Minor GC,Full GC主要有一下条件:

(一)System.gc()

(二)老年代空间不足:大对象进入导致

(三)担保分配失败

(四)CMS中并发清除阶段出现Concurrent Mode Failure错误

猜你喜欢

转载自blog.csdn.net/qq_27378875/article/details/81386491