0
点赞
收藏
分享

微信扫一扫

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

扒皮狼 2021-09-24 阅读 84
  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

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

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

举报

相关推荐

0 条评论