JVM的Young GC日志应该怎么看


prtyaa
prtyaa 2023-12-28 15:31:04 53206 赞同 0 反对 0
分类: 资源
就通过一步一图的方式,接着上篇内容继续来仔细分析GC日志,同时配合画图Young GC的实际执行过程。

先来把上篇文章的ygc日志拿过来

看最后两行.Allocation Failure:
表明本次引起GC的原因是因为在年轻代中没有足够的空间能够存储新的数据了。

 

0.269代表ygc的时间。

ParNew : 4030K->512K(4608K)

4608K 表示:年轻代可用空间为4.5MB,一个eden+一个survivor区

4030K->512K :对年轻代执行了一次GC,GC之前都使用了4030KB了,但是GC之后只有 512KB的对象 是存活下来的。

0.0015734 secs:本次gc大概耗费了1.5ms,仅仅是回收3MB的对象而已。

 

4030K->574K(9728K), 0.0017518 secs,这段话指的是整个Java堆内存的情况

总可用空间9728KB(9.5MB),其实就是年轻代4.5MB+老年代5M,然后GC前整个Java堆 内存里使用了4030KB,GC之后Java堆内存使用了574KB。

 

[Times: user=0.00 sys=0.00, real=0.00 secs] 可以看,这里最小单位是小数点之后两位,但是这里全部是0.00 secs,也就是说本次gc就耗费 了几毫秒,所以从秒为单位来看,几乎是0。


4、图解GC执行过程

第一个问题,看这行日志,ParNew: 4030K->512K(4608K), 0.0015734 secs

4608是新生代总大小 4.5MB 一个 eden+一个s区

大家很奇怪,我们在GC之前,明明在Eden区里就放了3个1MB的数组,一共是3MB,也就是3072KB的对象,那么GC 之前年轻代应该是使用了3072KB的内存啊,为啥是使用了4030KB的内存呢?

原因是:创建的数组本身虽然是1MB,但是为了存储这个数组,JVM内置还会附带一些其他信息,所以每个数组实际占 用的内存是大于1MB的;

然后ygc之后,新生代剩余512K的存活对象,从Eden区转移到了Survivor1区


5、GC过后的堆内存使用情况

这段日志是在JVM退出的时候打印出来的当前堆内存的使用情况

那么大家思考一下,此时在JVM退出之前,为什么年轻代占用了2.5MB的内存?

很简单,在gc之后,我们这不是通过如下代码又分配了一个2MB的数组吗:byte[] array2 = new byte[2 * 1024 * 1024];

所以此时在Eden区中一定会有一个2MB的数组,也就是2048KB,然后上次gc之后在From Survivor区中存活了一个 512KB的对象,大家也不知道是啥,先不用管他。

但是此时你疑惑了,2048KB + 512KB = 2560KB。

那为什么说年轻代使用了2601KB呢?

因为2MB的数组,还有对象的元数据,之前也说了,所以多出来的41kb就是元数据的大小。

 

继续看GC日志

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

评价 0 条
prtyaaL2
粉丝 1 资源 1949 + 关注 私信
最近热门资源
银河麒麟桌面操作系统备份用户数据  123
统信桌面专业版【全盘安装UOS系统】介绍  118
银河麒麟桌面操作系统安装佳能打印机驱动方法  109
银河麒麟桌面操作系统 V10-SP1用户密码修改  103
最近下载排行榜
银河麒麟桌面操作系统备份用户数据 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元

请使用微信扫码

加入交流群

请使用微信扫一扫!