zoukankan      html  css  js  c++  java
  • 【转】gc日志分析工具

    性能测试排查定位问题,分析调优过程中,会遇到要分析gc日志,人肉分析gc日志有时比较困难,相关图形化或命令行工具可以有效地帮助辅助分析。

    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发生的时间信息

     

    Gc日志

    日志中显示了gc发生的时间,young区回收情况,整体回收情况,fullGC情况,回收所消耗时间等

     

    常用JVM参数

    分析gc日志后,经常需要调整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。

     

    Gc日志分析工具

    (1)GCHisto

    http://Java.net/projects/gchisto

     

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

    统计了总共gc次数,youngGC次数,FullGC次数,次数的百分比,GC消耗的时间,百分比,平均消耗时间,消耗时间最小最大值等

     

    统计的图形化表示

    YoungGC,FullGC不同消耗时间上次数的分布图,勾选可以显示youngGC或fullGC单独的分布情况

    整个时间过程详细的gc情况,可以对整个过程进行剖析

     

    (2)GCLogViewer

     

    http://code.google.com/p/gclogviewer/

     

    点击run.bat运行

     

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

    Tools里还能比较不同gc日志

     

    (3)HPjmeter

     

    获取地址 http://www.hp.com/go/java
    参考文档 http://www.javaperformancetuning.com/tools/hpjtune/index.shtml

     

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

     

    (4)GCViewer

    http://www.tagtraum.com/gcviewer.html

    这个工具用的挺多的,但只能在JDK1.5以下的版本中运行,1.6以后没有对应。

    (5)garbagecat

    http://code.google.com/a/eclipselabs.org/p/garbagecat/wiki/Documentation

     

     

    其它监控方法

    Jvisualvm动态分析jvm内存情况和gc情况,插件:visualGC

      

    jvisualvm还可以heapdump出对应hprof文件(默认存放路径:监控的服务器 /tmp下),利用相关工具,比如HPjmeter可以对其进行分析

    grep Full gc.log粗略观察FullGC发生频率

    jstat –gcutil [pid] [intervel] [count]

    jmap -histo pid可以观测对象的个数和占用空间
    jmap -heap pid可以观测jvm配置参数,堆内存各区使用情况

    jprofiler,jmap dump出来用MAT分析

     

    如果要分析的dump文件很大的话,就需要很多内存,很容易crash。

    所以在启动时,我们应该加上一些参数: Java –Xms512M –Xmx1024M –Xss8M

  • 相关阅读:
    FTP服务总结
    编译安装hpptd2.4
    搭建DNS服务
    定制简单的Linux系统
    建立私有CA
    关于/boot文件的修复实验
    shell脚本进阶(二)
    datetime模块日期转换和列表sorted排序
    linux操作命令
    Python 中的特殊双下划线方法
  • 原文地址:https://www.cnblogs.com/liu-ke/p/5465272.html
Copyright © 2011-2022 走看看