模拟出对象进入老年代的场景(下)


prtyaa
prtyaa 2023-12-28 15:30:00 50698 赞同 0 反对 0
分类: 资源
1、对象是如何在Young GC过后因为放不下Survivor区域,就直接进入老年代了。?

2、示例代码

然后使用之前的JVM参数来跑一下上面的程序,可以看到下面的GC日志


3、一步一图来分析GC日志

上面的代码中,首先分配了3个2MB的数组,然后最后让array1变量指向了第三个2MB数组

接着创建了一个128K的数组,但是确让array2指向了null,同时我们一直都知道,Eden区里会有500KB左右的未知对象

 

接着会创建一个2MB的数组被array3引用

此时eden区肯定是放不下这2MB的数组的,因为只有8MB,已经占了6MB多,将近7MB的内存了,肯定是容不下最后一个数组的,所以此时必然触发一次Young GC。

YGC回收的是前两个2MB的数组,一共4MB的内存容量,还有那个128KB的array2所指的对象

重点来了

先看如下日志:ParNew: 7260K->573K(9216K), 0.0024098 secs。

此时内存里还剩下array1所指的2MB的数组,那这怎么剩下了573KB了呢?

其实道理很简单,大家可以想一下,这次GC的时候,会回收掉上图中的2个2MB的数组和1个128KB的数组,然后留下 一个2MB的数组和1个未知的500KB的对象

年轻代的垃圾回收是要往survivor区挪的

所以在这里并不是让2MB的数组和500KB的未知对象都进入老年代,而是把500KB的未知对象放入From Survivor区中!

 

从这里可以看到,很多细节,我都是逐步给大家揭露开来的,之前有人问我,如果对象放不下Survivor,是不是会有部分留在 Survivor,部分进入老年代?

但是现在结合GC日志,大家可以清晰的看到,在这种情况下,是会把部分对象放入Survivor区的。

如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!

评价 0 条
prtyaaL2
粉丝 1 资源 1949 + 关注 私信
最近热门资源
银河麒麟桌面操作系统备份用户数据  127
统信桌面专业版【全盘安装UOS系统】介绍  122
银河麒麟桌面操作系统安装佳能打印机驱动方法  114
银河麒麟桌面操作系统 V10-SP1用户密码修改  105
最近下载排行榜
银河麒麟桌面操作系统备份用户数据 0
统信桌面专业版【全盘安装UOS系统】介绍 0
银河麒麟桌面操作系统安装佳能打印机驱动方法 0
银河麒麟桌面操作系统 V10-SP1用户密码修改 0
作者收入月榜
1

prtyaa 收益393.62元

2

zlj141319 收益218元

3

1843880570 收益214.2元

4

IT-feng 收益209.03元

5

风晓 收益208.24元

6

777 收益172.71元

7

Fhawking 收益106.6元

8

信创来了 收益105.84元

9

克里斯蒂亚诺诺 收益91.08元

10

技术-小陈 收益79.5元

请使用微信扫码

加入交流群

请使用微信扫一扫!