jvm性能调优 - 10白话年轻代数据晋升老年代规则及老年代回收算法

本文详细探讨了JVM中对象从年轻代晋升到老年代的条件,包括对象年龄达到15岁、动态年龄判断、大对象直接进入老年代等规则。此外,文章还介绍了老年代垃圾回收算法,主要是标记整理算法,以及在Minor GC前后如何判断和处理老年代空间不足的问题,强调了避免频繁Full GC对系统性能的影响。
摘要由CSDN通过智能技术生成

在这里插入图片描述


Pre

上篇文章已经讲清楚了新生代的垃圾回收算法,包括跟这个垃圾回收算法搭配的新生代内存区域的划分,大家也都清楚了为什么有一块Eden区域和两块Survivor区域

那么本文就要给大家说说,新生代里的对象一般在什么场景下会进入老年代。

首先我们来看下面的图,我们写好的代码在运行的过程中,就会不断的创建各种各样的对象,这些对象都会优先放到新生代的Eden区和Survivor1区。

在这里插入图片描述
接着假如新生代的Eden区和Survivor1区都快满了,此时就会触发Minor GC,把存活对象转移到Survivor2区去

如下图所示

在这里插入图片描述

然后接着就会使用Eden区和Survivor2区,来分配新的对象,如下图所示。

在这里插入图片描述

这个过程上篇文章已经讲的非常的清楚了。那么这篇文章我们就来依次看看各种情况下,对象是如何进入老年代的,以及老年代的垃圾回收算法是什么样的?


躲过15次GC之后进入老年代

按照上面的图示的那个过程,其实大家可以理解为我们写的系统刚启动的时候,创建的各种各样的对象,都是分配在新生代里的。

然后慢慢系统跑着跑着,新生代就满了,此时就会触发Minor GC,可能就1%的少量存活对象转移到空着的Survivor区中。

然后系统继续运行,继续在Eden区里分配各种对象,大概就是这个过程。

那么之前给大家讲过,我们写的系统中有些对象是长期存在的对象,他是不会轻易的被回收掉的,比如下面的代码。

在这里插入图片描述

只要这个“Kafka”类还存在,那么他的静态变量“replicaManager”就会长期引用“ReplicaManager”对象,所以你无论新生代怎么垃圾回收,类似这种对象都不会被回收掉的。

此时这类对象每次在新生代里躲过一次GC被转移到一块Survivor区域中,此时他的年龄就会增长一岁

默认的设置下,当对象的年龄达到15岁的时候,也就是躲过15次GC的时候,他就会转移到老年代里去。

这个具体是多少岁进入老年代,可以通过JVM参数“-X

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小工匠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值