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

  • 相关阅读:
    Java Web 网络留言板2 JDBC数据源 (连接池技术)
    Java Web 网络留言板3 CommonsDbUtils
    Java Web ConnectionPool (连接池技术)
    Java Web 网络留言板
    Java Web JDBC数据源
    Java Web CommonsUtils (数据库连接方法)
    Servlet 起源
    Hibernate EntityManager
    Hibernate Annotation (Hibernate 注解)
    wpf控件设计时支持(1)
  • 原文地址:https://www.cnblogs.com/liu-ke/p/5465272.html
Copyright © 2011-2022 走看看