沈阳网站建设服务平台,石家庄模板建站,wordpress 采集教程,cnzz如何查询某个网站频道的流量性能测试排查定位问题#xff0c;分析调优过程中#xff0c;会遇到要分析gc日志#xff0c;人肉分析gc日志有时比较困难#xff0c;相关图形化或命令行工具可以有效地帮助辅助分析。 Gc日志参数 通过在tomcat启动脚本中添加相关参数生成gc日志 -verbose.gc开关可显示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日志 2016-11-23T11:01:27.7380800: 0.150: [GC [PSYoungGen: 331K-288K(5952K)] 331K-288K(19648K), 0.0006495 secs] [Times: user0.00 sys0.00, real0.00 secs]
2016-11-23T11:01:27.7390800: 0.152: [Full GC (System) [PSYoungGen: 288K-0K(5952K)] [PSOldGen: 0K-164K(13696K)] 288K-164K(19648K) [PSPermGen: 3054K-3054K(21248K)], 0.0059625 secs] [Times: user0.00 sys0.00, real0.01 secs]
2016-11-23T11:01:27.8520800: 0.264: [GC [PSYoungGen: 103K-64K(5952K)] 267K-228K(19648K), 0.0066830 secs] [Times: user0.00 sys0.00, real0.01 secs]
2016-11-23T11:01:27.8590800: 0.271: [Full GC (System) [PSYoungGen: 64K-0K(5952K)] [PSOldGen: 164K-165K(13696K)] 228K-165K(19648K) [PSPermGen: 3060K-3060K(21248K)], 0.0052429 secs] [Times: user0.01 sys0.00, real0.01 secs] 日志中显示了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 优点可以横向对比如jvm参数调整前和调整后进行对比等。 直接点击gchisto.jar就可以运行点add载入gc.log 统计了总共gc次数youngGC次数FullGC次数次数的百分比GC消耗的时间百分比平均消耗时间消耗时间最小最大值等 示例 jdk1.6jvm参数为-Xmx20m -XX:MaxDirectMemorySize10m -verbose:gc -XX:PrintGCTimeStamps -XX:PrintGCDetails -XX:PrintGCDateStamps -Xloggc:gc1.6.log 2016-11-23T11:01:27.7380800: 0.150: [GC [PSYoungGen: 331K-288K(5952K)] 331K-288K(19648K), 0.0006495 secs] [Times: user0.00 sys0.00, real0.00 secs]
2016-11-23T11:01:27.7390800: 0.152: [Full GC (System) [PSYoungGen: 288K-0K(5952K)] [PSOldGen: 0K-164K(13696K)] 288K-164K(19648K) [PSPermGen: 3054K-3054K(21248K)], 0.0059625 secs] [Times: user0.00 sys0.00, real0.01 secs]
2016-11-23T11:01:27.8520800: 0.264: [GC [PSYoungGen: 103K-64K(5952K)] 267K-228K(19648K), 0.0066830 secs] [Times: user0.00 sys0.00, real0.01 secs]
2016-11-23T11:01:27.8590800: 0.271: [Full GC (System) [PSYoungGen: 64K-0K(5952K)] [PSOldGen: 164K-165K(13696K)] 228K-165K(19648K) [PSPermGen: 3060K-3060K(21248K)], 0.0052429 secs] [Times: user0.01 sys0.00, real0.01 secs] GCHisto展示 统计的图形化表示 YoungGC,FullGC不同消耗时间上次数的分布图勾选可以显示youngGC或fullGC单独的分布情况 整个时间过程详细的gc情况可以对整个过程进行剖析 (2)GCLogViewer 只支持jdk1.632位jdk7jdk8不支持。 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虚拟机——内存管理与垃圾回收http://sunbean.blog.51cto.com/972509/768034转载于:https://www.cnblogs.com/duanxz/p/6092911.html