0
点赞
收藏
分享

微信扫一扫

Java GC系列二:Minor GC && Full GC的触发

西特张 2021-09-30 阅读 51

一、Minor GC何时触发?

触发条件有三种(达到一种就会触发):

  • Eden区域满了;
  • 新创建的对象大小 > Eden区所剩余空间;
  • Full GC时会先触发Minor GC(Full GC往往又是由minor GC触发,看下一段);

注:

  • Eden区是新生代的一个区域(另一个区域是Survivor区);
  • Minor GC仅针对新生代;

二、Full GC何时触发?

JVM在进行minor GC前会判断老年代最大可用连续空间是否大于新生代的所有对象总空间:

  1. 如果大于的话,则直接执行minor GC;
  2. 如果小于,则判断是否开启HandlerPromotionFailure,没有则执行Full GC;
  3. 如果开启了HandlerPromotionFailure,JVM会判断老年代的最大连续内存空间是否大于历次晋升的大小,如果小于则执行Full GC;
  4. 如果大于,则执行minor GC;

Full GC触发的条件:

  1. 调用System.gc()时,系统建议执行Full GC,但并不必然执行;
  2. 老年代空间不足;
  3. 方法区空间不足;
  4. 通过minor GC后进入老年代的平均大小大于老年代的可用内存;
  5. 由Eden区,From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小;

注:

  • 有些文章会将第5点讲成“Young GC出现promotion failure”,即Survivor中存活的对象拷贝至老年代时,老年代空间不足!
举报

相关推荐

0 条评论