GC日志如何分析?GC日志分析工具详解

TheDisguiser 2020-05-18 20:26:22 java常见问答 5358

有时候分析程序并调优过程中,可能会遇到需要分析gc日志的时候,自己手动分析gc日志会显得比较困难,下面我们就来看看如何分析gc日志和有哪些常用的gc日志分析工具吧。

一、gc日志分析

1.常用JVM参数

分析完gc日志,一般都会要对jvm当中的内存相关参数进行调整。

jvm常用的参数:

·Xms:初始堆大小,默认为物理内存的1/64(<1GB);默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制

·Xmx:最大堆大小,默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制

·Xmn:新生代的内存空间大小,注意:此处的大小是(eden+ 2 survivor space)。与jmap -heap中显示的New gen是不同的。整个堆大小=新生代大小 + 老生代大小 + 永久代大小。

在保证堆大小不变的情况下,增大新生代之后,将会减小老生代大小。

这个值对系统性能影响是比较大的,Sun官方推荐配置是整个堆的3/8。

·XX:SurvivorRatio:新生代中Eden区域与Survivor区域的容量比值,默认值为8。

两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10。

·Xss:每个线程的堆栈大小。

JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。

依据应用的线程所需内存大小进行适当调整。

在相同物理内存下,减小这个值能生成更多的线程。

可是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。

一般小的应用, 假如栈不是很深, 应该是128k够用的,大的应用建议使用256k。

这个选项对性能影响比较大,需要严格的测试。和threadstacksize选项解释很类似,官方文档似乎没有解释,在论坛中有这样一句话:"-Xss is translated in a VM flag named ThreadStackSize”一般设置这个值就可以了。

·XX:PermSize:设置永久代(perm gen)初始值。默认值为物理内存的1/64。

·XX:MaxPermSize:设置持久代最大值。物理内存的1/4。

2.Gc日志参数

通过在tomcat启动脚本中添加相关参数生成gc日志

·verbose.gc开关可显示GC的操作内容。打开它,可以显示最忙和最空闲收集行为发生的时间、收集前后的内存大小、收集需要的时间等。

打开-xx:+ printGCdetails开关,可以详细了解GC中的变化。

打开-XX: + PrintGCTimeStamps开关,可以了解这些垃圾收集发生的时间,自JVM启动以后以秒计量。

最后,通过-xx: + PrintHeapAtGC开关了解堆的更详细的信息。

为了了解新域的情况,可以通过-XX:=PrintTenuringDistribution开关了解获得使用期的对象权。

·Xloggc:$CATALINA_BASE/logs/gc.log gc日志产生的路径

XX:+PrintGCApplicationStoppedTime // 输出GC造成应用暂停的时间
-XX:+PrintGCDateStamps // GC发生的时间信息

3.Gc日志

2016 - 11 - 23 T11: 01: 27.738 + 0800: 0.150: [GC[PSYoungGen: 331 K - > 288 K(5952 K)]
331 K - > 288 K(19648 K), 0.0006495 secs][Times: user = 0.00 sys = 0.00, real = 0.00
secs]
2016 - 11 - 23 T11: 01: 27.739 + 0800: 0.152: [Full GC(System)[PSYoungGen:
        288 K - > 0 K(5952 K)][PSOldGen: 0 K - > 164 K(13696 K)] 288 K - > 164 K(19648 K)
[PSPermGen: 3054 K - > 3054 K(21248 K)], 0.0059625 secs][Times: user = 0.00
sys = 0.00, real = 0.01 secs]
2016 - 11 - 23 T11: 01: 27.852 + 0800: 0.264: [GC[PSYoungGen: 103 K - > 64 K(5952 K)]
267 K - > 228 K(19648 K), 0.0066830 secs][Times: user = 0.00 sys = 0.00, real = 0.01
secs]
2016 - 11 - 23 T11: 01: 27.859 + 0800: 0.271: [Full GC(System)[PSYoungGen:
        64 K - > 0 K(5952 K)][PSOldGen: 164 K - > 165 K(13696 K)] 228 K - > 165 K(19648 K)
[PSPermGen: 3060 K - > 3060 K(21248 K)], 0.0052429 secs][Times: user = 0.01
sys = 0.00, real = 0.01 secs]

上面日志中就详细显示了gc发生的各种情况。

二、gc日志分析工具详解

1)GCHisto

GCHisto优点:它支持横向对比

GCHisto安装后直接点击gchisto.jar就可以运行,点击add载入gc.log

它会帮助你统计总共gc次数,youngGC次数,FullGC次数,次数的百分比,GC消耗的时间,百分比,平均消耗时间,消耗时间最小最大值等等。

示例: 环境为jdk1.6,jvm参数为:-Xmx20m -XX:MaxDirectMemorySize=10m -verbose:gc -XX:+PrintGCTimeStamps -

XX: +PrintGCDetails - XX: +PrintGCDateStamps -
    Xloggc: gc1 .6.log
2016 - 11 - 23 T11: 01: 27.738 + 0800: 0.150: [GC[PSYoungGen: 331 K - > 288 K(5952 K)] 331 K - > 288 K(19648 K), 0.0006495 secs][Times: user = 0.00 sys = 0.00, real = 0.00 secs]
2016 - 11 - 23 T11: 01: 27.739 + 0800: 0.152: [Full GC(System)[PSYoungGen: 288 K - > 0 K(5952 K)][PSOldGen: 0 K - > 164 K(13696 K)] 288 K - > 164 K(19648 K)[PSPermGen: 3054 K - > 3054 K(21248 K)], 0.0059625 secs][Times: user = 0.00 sys = 0.00, real = 0.01 secs]
2016 - 11 - 23 T11: 01: 27.852 + 0800: 0.264: [GC[PSYoungGen: 103 K - > 64 K(5952 K)] 267 K - > 228 K(19648 K), 0.0066830 secs][Times: user = 0.00 sys = 0.00, real = 0.01 secs]
2016 - 11 - 23 T11: 01: 27.859 + 0800: 0.271: [Full GC(System)[PSYoungGen: 64 K - > 0 K(5952 K)][PSOldGen: 164 K - > 165 K(13696 K)] 228 K - > 165 K(19648 K)[PSPermGen: 3060 K - > 3060 K(21248 K)], 0.0052429 secs][Times: user = 0.01 sys = 0.00, real = 0.01 secs]

2)GCLogViewer

GCLogViewer只支持jdk1.6(32位)

安装后点击run.bat运行

它会显示整个过程gc情况的趋势图,还有gc类型,吞吐量,平均gc频率,内存变化趋势等。

Tools里还能比较不同gc日志。

3)HPjmeter

一个强大的工具,但只能打开由以下参数生成的GC log, -verbose:gc -Xloggc:gc.log,添加其他参数生成的gc.log无法打开。

以上就是gc日志的所有内容了,更多详细java常见问答知识,烦请一直关注我们了解详情吧。

推荐阅读:

GC日志是什么?GC日志怎么看?

GC算法,gc算法有哪些?