内存分配策略:minor gc前后的几种特殊情况

  1. 大对象直接进入老年代
    相关参数 -XX:PretenureSizeThreshold

  2. 动态年龄判断
    minor gc 后,一批对象总大小超过了 survivor 区的 50%,那么就让大于等于这批对象年龄的对象直接进入老年代
    具体规则是,从年龄1的对象开始,把 年龄1 + 年龄2 + 年龄n 多个年龄的对象的总和超过survivor区的50%,就此时就会把年龄 n 以上的对象放入老年代

  3. 老年代空间担保
    如果年轻代的对象需要晋升到老年代,老年代空间也可能不够。所以在执行 minor gc 之前,jvm会先检查一下老年代最大可用的连续内存空间, 是否能能放下 新生代所有的对象, 如果设置了 -XX:HandlePromotionFailure 则会进行下一步判断,看 是否大于 minor gc历次晋升到老年代对象的平均大小
    比如,上一次 minor gc 后有 10m 对象晋升到老年代,此时老年代最大连续可用空间大于10m,说明老年代空间是够的
    如果判断失败了,或者没有设置 “-XX:HandlePromotionFailure” 就会先进行一次 full gc 多腾出一些空间来, 然后在进行 mninor gc

jdk1.6 update24之后, HandlePromotionFailure 没作用了,
只要老年代的连续空间大于新生代对象总大小或者历次晋升对象的平均
大小就可以进行 minor gc

  1. minor gc 后,survivor 区存放不下那部分存活对象 挪到老年代
    a. 单个对象就比 survivor 大,直接挪到老年代
    b. 并不是全部都挪到老年代
    c. 如果老年代放不下所有的晋升对象 则会发生fullgc

老年代回收速度比年轻代慢 10 倍,年轻代一般就几十ms

posted @ 2021-03-15 23:26  mushishi  阅读(127)  评论(0编辑  收藏  举报