JVM内存状况查看方法和分析工具(上)

  Java本身提供了多种丰富的方法和工具来帮助开发人员查看和分析GC及JVM内存的状况,同时开源界和商业界也有一些工具可用于查看、分析GC及JVM内存的状况。通过这些分析,可以排查程序中内存泄露的问题及调优程序的性能。下面介绍几种常用的免费工具,其中知名的有JProfiler 等。

  1. 输出GC日志

  输出GC日志对于跟踪分析GC的状况来说,无疑是最直接地分析内存回收状况的方法,只是GC日志输出后需要人为地进行分析,以判断GC的状况。

  JVM支持将日志输出到控制台或指定的文件中,方法有如下几种。

  输出到控制台

  在JVM的启动参数中加入-XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCApplicationStoppedTime,按照参数的顺序分别输出GC的简要信息,GC的详细信息、GC的时间信息及GC造成的应用暂停的时间。

  输出到指定的文件

  在1中的jvm启动参数中再增加-Xloggc: gc.log可指定将gc的信息输出到gc.log中。

  可用于GC跟踪分析的参数还有-verbose:gc、-XX:+PrintTenuringDistribution等。

  2. GC Portal

  将GC日志输出固然有一定的作用,但如果要靠人为进行分析,还是相当复杂的。因此Sun提供了一个GC Portal来帮助分析这些GC日志,并生成相关的图形化的报表,GC Portal部署起来会有些麻烦,它需要运行在老版本的Tomcat上,同时需要数据库,部署完毕后通过上传日志文件的方式即可完成GC日志的分析,此GC日志输出的JVM参数为:-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps [-Xloggc:文件名],在上传日志时GC Portal的选项里只有jdk 1.2或jdk 1.2-1.4的版本。虽然经过测试,JDK 6的日志也是可以分析出来的,但它的限制在于仅支持5MB的gc日志的分析,GC Portal可提供吞吐量的分析、耗费的CPU的时间、造成的应用暂停的时间、每秒从新生代转化到旧生代的数量、minor GC的状况及Full GC的状况等,如图1所示。

  

  图1 GCPortal示例

  GC Portal中还有一个很有用的部分是提供调整GC参数的预测,例如可以选择给young size增加20%的空间。GC Portal会根据当前的日志信息来评估在调整参数后的运行效果,不一定很准确,但毕竟能带来一些参考意义。

  3. JConsole

  JConsole可以图形化查看JVM中内存的变化状况,JConsole是JDK 5及以上版本中自带的工具,位于JDK的bin目录下,运行时直接运行JConsole.exe或JConsole.sh(要求支持图形界面)。在本地的Tab页上看到运行了java的pid,双击即可查看相应进程的JVM状况,同时,JConsole也支持查看远程的JVM的运行状况,具体可参见JConsole的User Guide。

  JConsole中显示了JVM中很多的信息:内存、线程、类和MBean等,在打开JConsole的内存Tab页后,可看到JVM内存部分的运行状况。这对于分析内存是否有溢出及GC的效果更加直接明了,JConsole的运行效果如图2所示。

  

  图2 JConsole运行效果

  4. JVisualVM

  JVisualVM是JDK 6 update 7之后推出的一个工具,它类似于JProfiler的工具,基于此工具可查看内存的消耗情况、线程的执行状况及程序中消耗CPU、内存的动作。

  在内存分析上,JVisualVM的最大好处是可通过安装VisualGC插件来分析GC趋势、内存消耗详细状况。

  VisualGC的运行如图3所示。

  

  图3 VisualGC运行效果

  从图3中可看到各区的内存消耗状况及GC Time的图表,其提供的Histogram视图对于调优也有很大帮助。

  基于JVisualVM的Profiler中的Memory还可查看对象占用内存的状况,如图4所示。

  4. JMap

  JMap是JDK中自带的一个用于分析JVM内存状况的工具,位于JDK的bin目录下。使用JMap可查看目前JVM中各个代的内存状况、JVM中对象的内存的占用状况,以及导出整个JVM中的内存信息。

  

  图4 JVisualVM Memory Profiler图示

  查看JVM中各个代的内存状况

  在linux上执行jmap -heap [pid],就可查看整个JVM中内存的状况,看到的信息类似如下(和JDK版本、GC策略有关):

  

    usingthread-localobjectallocation. ParallelGCwith8thread(s) HeapConfiguration: MinHeapFreeRatio=40 MaxHeapFreeRatio=70 MaxHeapSize=1610612736(1536.0MB) NewSize=524288000(500.0MB) MaxNewSize=524288000(500.0MB) OldSize=4194304(4.0MB) NewRatio=8 SurvivorRatio=8 PermSize=100663296(96.0MB) MaxPermSize=268435456(256.0MB) HeapUsage: PSYoungGeneration EdenSpace: capacity=430702592(410.75MB) used=324439936(309.4100341796875MB) free=106262656(101.3399658203125MB) 75.32806675098904%used FromSpace: capacity=46333952(44.1875MB) used=13016424(12.413429260253906MB) free=33317528(31.774070739746094MB) 28.092626331550566%used ToSpace: capacity=46792704(44.625MB) used=0(0.0MB) free=46792704(44.625MB) 0.0%used PSOldGeneration capacity=1086324736(1036.0MB) used=945707880(901.8973159790039MB) free=140616856(134.1026840209961MB) 87.05572548059884%used PSPermGeneration capacity=100663296(96.0MB) used=46349592(44.202415466308594MB) free=54313704(51.797584533691406MB) 46.044182777404785%used

  相关链接:

  JVM内存状况查看方法和分析工具(下)

快乐要懂得分享,才能加倍的快乐

JVM内存状况查看方法和分析工具(上)

相关文章:

你感兴趣的文章:

标签云: