zoukankan      html  css  js  c++  java
  • Minor GC 和 Full GC的时机

    一、对象何时能够进入老年代

    1. GC年龄判定

        每进行一次GC过程,存活的对象的GC年龄都会+1;当对象逃过15次GC,年龄达到15岁时,即可进入老年代

        可以通过-XX:MaxTenuringThreshld来设置岁数,默认是15,一般不需要修改。

      2. 动态对象年龄判定

        当前使用的Survivor区存活的对象,相同年龄的对象的总内存大小大于这块Survivor区大小的50%时,该Survivor区的所有年龄大于等于该年龄的对象直接进入老年代,而不需           要经过15次GC;

      3. 大对象直接进入老年代

        通过-XX:PretenureSizeThreshold设置对象的大小(单位:字节),当创建的对象大小大于该值时,直接进入老年代;

      4. Minor GC后的对象太多,无法再保存到Survivor区了

        直接加入到老年代。

    二、Minor GC

      当Eden和其中一个Survivor满了的时候,就需要执行Minor GC了。

      每次执行Minor GC之前,都需要判断当前老年代的可用内存大小是否大于新生代的对象大小

      1. 当老年代可用大小大于新生代的对象大小时,可以安全的执行Minor GC,因为考虑到最坏的情况,所有的对象均存活,且大于另一个空的Survivor区,那么全部进入老年代;

      2. 当老年代的大小小于新生代的对象大小时,则开始判断是否设置了-XX:-HandlePromotionFailure参数,如果没有设置,那么执行一次Full GC ,再执行Minor GC;

      3. 如果设置了-XX:-HandlePromotionFailure参数,那么判断一下老年代的剩余内存大小是否小于之前Minor GC进入老年代的对象的大小的平均值,如果小于的话,那么先执行一       次Full GC ,再执行Minor GC;

      4. 如果老年代的可用大小大于每次Minor GC 进入老年代对象大小的平均值,那么冒险进行Minor GC,可能的情况如下3种

        4.1 Minor GC后,存活的对象大小放入另一个空的Survivor区域;

        4.2 Minor GC后,存活的对象大小大于Survivor大小,但是小于老年代的可用内存大小,那么存活对象放入老年代;

        4.3 Minor GC后,存活的对象大小小于老年代的剩余内存大小,此时会触发一个Full GC,释放老年代的内存空间,如果此时还是不能存下新生代过来的对象,那么就会报出                            OOM 内存溢出。

  • 相关阅读:
    猫 先吃药
    用抛物线筛选素数
    999999999分解质因数
    九宫数独简介(转)
    空间想象力大战!Smale球面外翻问题
    神奇的分形艺术(一):无限长的曲线可能围住一块有限的面积
    Kobon问题新进展:17条直线可构成多少个互不重叠的三角形
    关于2008:你必须知道的10个事实
    正多边形的滚动与旋轮线下的面积
    我见过的最酷的排序算法演示(乐死我了~)
  • 原文地址:https://www.cnblogs.com/zjting/p/11304556.html
Copyright © 2011-2022 走看看