JVM垃圾回收系列--Java垃圾回收的原理与触发时机

原文网址:JVM垃圾回收系列--Java垃圾回收的原理与触发时机_IT利刃出鞘的博客-CSDN博客

简介

说明

本文介绍Java的垃圾回收,包括:Young GC的触发时机,Full GC的触发时机,System.gc()作用。

相关网址

JVM-内存模型/垃圾回收流程 - 自学精灵

Young GC(Minor GC)

什么时候会触发Minor GC?

  1. 大多数情况下,对象在年轻代中的Eden区进行分配,若Eden区没有足够空间,就会触发YGC(Minor GC)。

Full GC(Major GC)

简介

FGC处理的区域包括年轻代和老年代。

什么时候会触发Full GC?

  1. 老年代的内存使用率达到了一定阈值(默认是92%  通过-XX:MaxTenuringThreshoId设置)
    1. 情景1:Survivor区进行了15次清理后还没清理的对象,则放到老年代。
      1. 次数这个阈值是可以设置的:-XX:MaxTenuringThreshold(默认是15)
    2. 情景2:Minor GC时的检查
      1. 执行Minor GC时,JVM会先检查Survivor空间是否够用
        1. 如果够用则直接进行Minor GC
        2. 如果不够用,则检查老年代最大连续可用空间是否大于新生代的总和或者历次晋升到老年代的对象的平均大小
          1. 如果大于,则直接执行Minor GC(这个时候执行是没有风险的)。
          2. 如果小于,则直接执行Full GC
      2. JDK7及之后,空间分配担保参数:-XX:HandlePromotionFailure就失效了,无需考虑这个。
    3. 情景3:使用了大对象
      1. 大对象会直接进入老年代。比如:一次加载过多数据到内存(比如SQL查询未分页),导致大对象进入老年代。
      2. 相关参数:-XX:PretenureSizeThreshold。若对象大小大于此值,就会绕过新生代, 直接在老年代中分配。
  2. Metaspace(元空间)扩容到了-XX:MetaspaceSize 参数的指定值。(元空间在空间不足时会进行扩容)
  3. 程序执行了System.gc()
    1. 只是建议JVM执行FGC,并不一定会执行
  4. jmap 加了:live参数
    1. 例如:
      1. jmap -histo:live
      2. jmap -dump:live,format=b,file=heap.bin
  5. 其他
    1. 上一次GC之后Heap的各域分配策略动态变化
    2. RMI等的定时触发
    3. YGC时的悲观策略 

System.gc()

上边是文章的部分内容,为便于维护,全文已迁移到此网址:JVM-Java垃圾回收的原理与触发时机 - 自学精灵


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部