JVM内存分配_---JVM在进行内存回收时,是如何识别哪些对象应该放在新生代,哪些对象应该放在老年代的?

首先,了解这一过程,必须对堆的内存模型进行了解。先看下图:
这里写图片描述
JVM将堆内存分为新生代(1/3的堆内存)和老年代(2/3的堆内存)两个区域。
新生代区域一般采用复制算法对内存进行回收。
老年代区域则采用标记清除算法和标记压缩算法对内存进行回收。
JVM为了便于内存管理,又将新生代分为3个区域:Eden空间、From空间和To空间,From和To空间也称为Survivor空间,用来存放没有被Minor GC 回收的对象。其中from和to空间可以看做用来执行复制算法操作的两块大小相等的内存区域(可以互相转换)。
好了了解了堆内存的模型之后,来说以下JVM是如何识别新生代和老年代对象的。

首先,JVM为每一个对象定义一个对象年龄计数器。在分配对象时,优先将对象
分配到新生代的Eden空间。当对象经过第一次Minor GC后仍然存活,且能被Survivor(To、From空间)容纳的话,就会被移动到Survivor空间中,并将对象年龄设定为1,之后,对象在Survivor区域每经历过一次Minor GC后,对象年龄计数器就加1,当对象年龄计数器达到15岁(默认年龄,也可通过参数设置)时,如果对象仍然存活,就会晋升为老年代中。

虚拟机并不是永远要求对象的年龄达到最大年龄才能晋升到老年代,对象还可以通过另外一种方式晋升到老年代,即如果对象在Survivor空间中,相同年龄的所有对象的内存大小大于Survivor空间的一半时(无法执行复制操作了),年龄大于或等于该年龄的对象就可以直接进入老年代。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值