美文网首页
minorGC和FullGC

minorGC和FullGC

作者: Tomy_Jx_Li | 来源:发表于2019-04-04 09:49 被阅读0次

什么是minorGC和FullGC

minorGC是发生在新生代的GC,而FullGC是发生在老年代的GC。至于为何要区分这两个GC呢。因为minorGC相对于FullGC来说,导致的STP(stop the world)更少。发现很多资料中说明只有在fullGC的时候才有STP这一点来说,不敢苟同。因为无论是何种垃圾收集器都无法避免STP。而且老年代对象一般是经历了好几轮的minorGC了,所以空间回收率比较低。所以总的来说。minorGC频繁但是回收快,回收率高。fullGC不频繁但是回收慢,回收率低。

什么时候发生minorGC

  • 1.首先必要条件是:新生对象需要分配到新生代的Eden。而当Eden区的内存不够时就需要判断是否进行minorGC了
  • 2.查看老年代中空闲空间是否大于所有的新生代对象之和,是的话直接minorGC了。否的话,就需要查看是否开启了空间担保失败了(配置参数HandlerPromotionFailure)。如果允许担保失败,那么还需要查看下老年代空间是否大于历次minorGC后进入老年代对象的大小平均值。如果是则minorGC,否则fullGC。
  • 3.如果

什么时候发生fullGC

  • 1.老年代空间不足。(这里如果是CMS可以配置一个百分比,即老年代达到这个百分比就进行垃圾回收)
  • 2.永久代空间不足。
  • 3.空间担保策略。也就是上述minorGC的第二点
  • 4.显示调用System.gc()。这个方法的调用默认是执行的fullGC。所以生产上有时候频发的fullGC可能就是一些框架进行显示调用这个方法导致的。可以使用-XX:+DisableExplicitGC禁用。
  • 5.jamp命令dump内存信息的时候。(dump内存信息一般都是为了查看内存问题的,不能让无用对象干扰判断)

对象何时进入老年代或者新生代呢

新分配的对象一般是直接进入新生代的。但是如果出现以下的情况,会让对象进入老年代。

  • 1.新分配的对象占用空间大于-XX:PretenureSizeThreshold时直接分配到老年代
  • 2.minorGC的时候,surivior中的内存不足了,对象进入老年代(也就是内存担保)。
  • 3.minorGC的时候,对象的年龄大于-XX:MaxTenuringThreshold时,进入老年代。这个参数设置的时候,看到好多是设置成大于15的数了。但是因为最大的年龄只能是15。因为对象头中,年龄占4bit。
  • 4.当进行minorGC的时候,相同年龄的对象占用空间大于等于surivior区的一半了,那么这个年龄的对象就进入老年代。

相关文章

网友评论

      本文标题:minorGC和FullGC

      本文链接:https://www.haomeiwen.com/subject/ltixiqtx.html