JVM - 6:对象在JVM中如何分配,如何扭转的

12 篇文章 2 订阅

在之前的文章中提到了

JVM是如何运行起来的

JVM中的内存区域

以及堆内存的分代模型

通过之前的文章,知道了大部分的对象是优先分配在堆内存的

但是大部分正常的对象都是优先分配在新生代的

最典型的就是通过静态变量引用的对象,虽然它是长期存活的对象

但是哪怕是这种对象也是优先分配在新生代的

什么情况下会触发新生代垃圾回收

垃圾回收有它的触发条件

必备的条件是没有人引用这些对象了

如果,某个时刻新生代的垃圾对象太多了

这个时候需要创建一个对象,发现空间不够

这个时候才会对新生代进行垃圾回收

新生代的垃圾回收也被称之为 Minor GC 或者 Young GC

在我们日常开发中使用到的对象基本上都是这种,使用之后,就可以立马回收的对象

对于长期存活的对象

例如通过 成员变量 static 引用的 对象

它也是分配在新生代的

只不过它会躲过多次垃圾回收

因为它会一直被静态变量给引用

所以它不会被回收

在JVM中有一条规定

当一个对象躲过了 15 次 GC 之后

每躲过一次 GC 就会对这个对象的年龄 +1

也就是 15 岁之后

那么它就会被判定为一个老人

就会被判定为会长期存活的对象

之后它会被转移到老年代

顾名思义,老年代,就是存放年龄很大的对象

那么老年代的对象会被回收吗?

老年代的对象是肯定会被回收的

因为老年代的对象,也会随着时间的流逝不会被人引用

如果随着这种情况越来越多

势必会影响老年代的内存空间不足

新加入到老年代的对象没有空间存放

这个时候会触发老年代的垃圾回收

总结

对象会分配在新生代

如果新生代满了,会触发 Minor GC 或者 Young GC 来回收没有人引用的垃圾对象

如果一个对象躲过了 15 次 GC ,则会转移到老年代

如果老年代也满了,也会触发垃圾回收机制,把没人引用的垃圾对象回收

对象分配这块还有很多机制

新生代垃圾回收之后,导致存活对象太多,S1区域存放不下会导致大量对象进入老年代

对于超大对象会直接不经过新生代直接进入老年代

动态对象的年龄判断机制

空间担保机制

等等

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值