Minor GC 和新生代对象的晋升

背景

Java 中的对象优先在 Eden 分配,当 Eden 区满时会触发 Minor GC。

Minor GC 的耗时

  1. 标记过程的耗时。
  2. 复制过程的耗时。
  3. 如果开启了 GC 日志,打印日志的耗时。

新生代对象晋升到老年代有多种情况

  1. 触发 Minor GC 时,Eden 区和一个 Survivor 区中存活的对象大于另一个 Survivor 区的大小,则通过分配担保机制进入老年代。
  2. 若对象太大, 新生代无法容纳这个对象,直接进入老年代。
  3. 长期存活的对象将进入老年代。对象的年龄达到 MaxTenuringThreshold 晋升到老年代。
  4. 动态对象年龄判定。如果在 Survivor 区中相同年龄的对象的所有大小之和超过 Survivor 空间的一半,此时说明已经容纳不下对象了,因为 Survivor 区真实可用的空间为 Survivor 区的一半,所以直接晋升老年代。

Survivor 的意义

Survivor 的存在意义是减少被送到老年代的对象,进而减少 Full GC 的发生。

Survivor 为什么要划分为两块

目的: 解决内存碎片的问题。

流程

JVM 把新生代中的 Survivor 区分为两块,一块用来放存活对象,另一块什么都不放。当新生代发生 Minor GC 时,把 Eden 区中存活的对象和一块用来放存活对象的 Survivor 区中的存活对象复制到另一块 Survivor 区中,并且清空 Eden 区和当前这块 Survivor 区。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值