GC日志分析一篇带走~
创始人
2025-05-28 17:26:32
0

通过阅读GC日志,我们可以了解Java虚拟机内存分配与回收策略。 内存分配与垃圾回收的参数列表

  • -XX:+PrintGC 输出GC日志。类似:-verbose:gc

  • -XX:+PrintGCDetails 输出GC的详细日志

  • -XX:+PrintGCTimestamps 输出GC的时间戳(以基准时间的形式)

  • -XX:+PrintGCDatestamps 输出GcC的时间戳(以日期的形式,如2013-05-04T21:53:59.234+0800)

  • -XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息

  • -Xloggc:../logs/gc.log 日志文件的输出路径

1、打开GC日志方式一

-verbose:gc

这个只会显示总的GC堆的变化,如下:

[GC (Allocation Failure) 80832K->19298K(227840K),0.0084018 secs]
[GC (Metadata GC Threshold) 109499K->21465K(228352K),0.0184066 secs]
[Full GC (Metadata GC Threshold) 21465K->16716K(201728K),0.0619261 secs]

结果解析

GC、Full GC:GC的类型,GC只在新生代上进行,Full GC包括永生代,新生代,老年代。
Allocation Failure:GC发生的原因。
80832K->19298K:堆在GC前的大小和GC后的大小。
228840k:现在的堆大小。
0.0084018 secs:GC持续的时间。

2、打开GC日志方式二

-verbose:gc -XX:+PrintGCDetails

输出信息如下:

[GC (Allocation Failure) [PSYoungGen:70640K->10116K(141312K)] 80541K->20017K(227328K),0.0172573 secs] [Times:user=0.03 sys=0.00,real=0.02 secs]
[GC (Metadata GC Threshold) [PSYoungGen:98859K->8154K(142336K)] 108760K->21261K(228352K),0.0151573 secs] [Times:user=0.00 sys=0.01,real=0.02 secs]
[Full GC (Metadata GC Threshold)[PSYoungGen:8154K->0K(142336K)]
[ParOldGen:13107K->16809K(62464K)] 21261K->16809K(204800K),[Metaspace:20599K->20599K(1067008K)],0.0639732 secs]
[Times:user=0.14 sys=0.00,real=0.06 secs]

结果解析:

GC,Full FC:同样是GC的类型
Allocation Failure:GC原因
PSYoungGen:使用了Parallel Scavenge并行垃圾收集器的新生代GC前后大小的变化
ParOldGen:使用了Parallel Old并行垃圾收集器的老年代GC前后大小的变化
Metaspace: 元数据区GC前后大小的变化,JDK1.8中引入了元数据区以替代永久代
xxx secs:指GC花费的时间
Times:user:指的是垃圾收集器花费的所有CPU时间,sys:花费在等待系统调用或系统事件的时间,real:GC从开始到结束的时间,包括其他进程占用时间片的实际时间。

3、打开GC日志方式三

-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimestamps -XX:+PrintGCDatestamps

输出信息

2019-09-24T22:15:24.518+0800: 3.287: [GC (Allocation Failure) [PSYoungGen:136162K->5113K(136192K)] 141425K->17632K(222208K),0.0248249 secs] [Times:user=0.05 sys=0.00,real=0.03 secs]2019-09-24T22:15:25.559+0800: 4.329: [GC (Metadata GC Threshold) [PSYoungGen:97578K->10068K(274944K)] 110096K->22658K(360960K),0.0094071 secs] [Times: user=0.00 sys=0.00,real=0.01 secs]2019-09-24T22:15:25.569+0800: 4.338: [Full GC (Metadata GC Threshold) [PSYoungGen:10068K->0K(274944K)][ParoldGen:12590K->13564K(56320K)] 22658K->13564K(331264K),[Metaspace:20590K->20590K(1067008K)],0.0494875 secs] [Times: user=0.17 sys=0.02,real=0.05 secs]

说明:带上了日期和实践

如果想把GC日志存到文件的话,是下面的参数:

-Xloggc:/path/to/gc.log

4、日志补充说明

  • "[GC"和"[Full GC"说明了这次垃圾收集的停顿类型,如果有"Full"则说明GC发生了"Stop The World"

  • 使用Serial收集器在新生代的名字是Default New Generation,因此显示的是"[DefNew"

  • 使用ParNew收集器在新生代的名字会变成"[ParNew",意思是"Parallel New Generation"

  • 使用Parallel scavenge收集器在新生代的名字是”[PSYoungGen"

  • 老年代的收集和新生代道理一样,名字也是收集器决定的

  • 使用G1收集器的话,会显示为"garbage-first heap"

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

  • [PSYoungGen:5986K->696K(8704K) ] 5986K->704K(9216K)
    中括号内:GC回收前年轻代大小,回收后大小,(年轻代总大小)
    括号外:GC回收前年轻代和老年代大小,回收后大小,(年轻代和老年代总大小)

  • user代表用户态回收耗时,sys内核态回收耗时,rea实际耗时。由于多核的原因,时间总和可能会超过real时间

Heap(堆)
PSYoungGen(Parallel Scavenge收集器新生代)total 9216K,used 6234K [0x00000000ff600000,0x0000000100000000,0x0000000100000000)
eden space(堆中的Eden区默认占比是8)8192K,768 used [0x00000000ff600000,0x00000000ffc16b08,0x00000000ffe00000)
from space(堆中的Survivor,这里是From Survivor区默认占比是1)1024K, 0% used [0x00000000fff00000,0x00000000fff00000,0x0000000100000000)
to space(堆中的Survivor,这里是to Survivor区默认占比是1,需要先了解一下堆的分配策略)1024K, 0% used [0x00000000ffe00000,0x00000000ffe00000,0x00000000fff00000)

ParOldGen(老年代总大小和使用大小)total 10240K, used 7001K [0x00000000fec00000,0x00000000ff600000,0x00000000ff600000)
object space(显示个使用百分比)10240K,688 used [0x00000000fec00000,0x00000000ff2d6630,0x00000000ff600000)
PSPermGen(永久代总大小和使用大小)total 21504K, used 4949K [0x00000000f9a00000,0x00000000faf00000,0x00000000fec00000)
object space(显示个使用百分比,自己能算出来)21504K, 238 used [0x00000000f9a00000,0x00000000f9ed55e0,0x00000000faf00000)

5、Minor GC日志 详解

6、Full GC 日志 详解

7、实例

代码:

private static final int _1MB = 1024 * 1024;
/*** 设置JVM参数 -Xms10m -Xmx10m -XX:+PrintGCDetails*/
public static void testAllocation() {byte [] allocation1, allocation2, allocation3, allocation4;allocation1 = new byte[2 *_1MB];allocation2 = new byte[2 *_1MB];allocation3 = new byte[2 *_1MB];allocation4 = new byte[4 *_1MB];
}public static void main(String[] args) {testAllocation();
}

jdk7下内存分配图例

jdk8下内存分配图例

可以用一些工具去分析这些GC日志

常用的日志分析工具有:GCViewer、GCEasy、GCHisto、GCLogViewer、Hpjmeter、garbagecat等

相关内容

热门资讯

小学教育见习报告 小学教育见习报告小学教育见习报告 月22日早上,我们07级汉语言文学(小学教育)专业的学生来到了久负...
员工离职报告 员工离职报告范文3篇  在当下这个社会中,报告十分的重要,报告包含标题、正文、结尾等。那么一般报告是...
大学生心理健康的自我成长报告 大学生心理健康的自我成长报告范文1000字  在当下这个社会中,需要使用报告的情况越来越多,要注意报...
开题报告的文献综述怎么写   文献综述是研究者在其提前阅读过某一主题的文献后,经过理解、整理、融会贯通,综合分析和评价而组成的...
九九重阳节活动简报 九九重阳节活动简报(通用16篇)  在日常学习、工作抑或是生活中,很多地方都会使用到简报,简报不是一...
初中生课外阅读情况调查报告 初中生课外阅读情况调查报告  一、调查目的  在日常语文教学过程中,我们经常可以发现学生们由于积累不...
参观学习报告 参观学习报告  在日常生活和工作中,报告有着举足轻重的地位,其在写作上有一定的技巧。那么,报告到底怎...
综治工作述职报告 综治工作述职报告(精选7篇)  光阴的迅速,一眨眼就过去了,回顾过去的工作,倍感充实,收获良多,将过...
经营分析报告 经营分析报告(精选5篇)  在生活中,报告有着举足轻重的地位,报告具有双向沟通性的特点。其实写报告并...
大学生调查报告 大学生调查报告13篇  随着个人的素质不断提高,我们都不可避免地要接触到报告,我们在写报告的时候要注...
开题报告的内容与撰写要求   开题报告的内容一般包括:题目、立论依据(毕业论文选题的目的与意义、国内外研究现状)、研究方案(研...
寒假实践报告 寒假实践报告范文【5篇】  在我们平凡的日常里,报告有着举足轻重的地位,其在写作上有一定的技巧。一起...
实习报告个人总结 实习报告个人总结  导语:个人总结,就是把一个时间段的个人情况进行一次全面系统的总检查、总评价、总分...
家乡民俗文化调查报告 家乡民俗文化调查报告(精选10篇)  要去了解一件不明白的事情时,我们通常要进行专门的调查研究,并且...
保险公司实习报告 保险公司实习报告  我们眼下的社会,报告的使用频率呈上升趋势,我们在写报告的时候要注意逻辑的合理性。...
英国留学申请时间   有意申请2015秋季英国大学的同学,现在就必须开始提交申请了。基础申请材料包括:成绩单、在读证明...
文明社区自查报告 文明社区自查报告(通用20篇)  随着社会一步步向前发展,越来越多人会去使用报告,写报告的时候要注意...
错别字调查报告 错别字调查报告(汇编15篇)  在经济发展迅速的今天,报告与我们的生活紧密相连,其在写作上具有一定的...
城镇化建设问题调研报告 生态文明建设调研报告推荐度:新农村建设调研报告推荐度:生态文明建设调研报告推荐度:小城镇建设调研报告...
房地产销售述职报告 房地产销售述职报告15篇  我们眼下的社会,报告与我们的生活紧密相连,不同种类的报告具有不同的用途。...