有时候分析程序并调优过程中,可能会遇到需要分析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常见问答知识,烦请一直关注我们了解详情吧。
推荐阅读: