Let's Go!

Java 内存泄露监控工具 -- JVM监控工具介绍jstack, jconsole, jinfo, jmap, jdb, jsta

上一篇 / 下一篇  2011-11-10 19:02:52 / 个人分类:测试工具

jstack-- 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到 当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。目前只有在Solaris和Linux的JDK版本里面才有。

 

jconsole– jconsole是基于Java Management Extensions (JMX)的实时图形化监测工具,这个工具利用了内建到JVM里面的JMX指令来提供实时的性能和资源的监控,包括了Java程序的内存使用,Heap size, 线程的状态,类的分配状态和空间使用等等。

 

jinfo – jinfo可以从core文件里面知道崩溃的Java应用程序的配置信息,目前只有在Solaris和Linux的JDK版本里面才有。

 

jmap– jmap 可以从core文件或进程中获得内存的具体匹配情况,包括Heap size, Perm size等等,目前只有在Solaris和Linux的JDK版本里面才有。

 

jdb– jdb 用来对core文件和正在运行的Java进程进行实时地调试,里面包含了丰富的命令帮助您进行调试,它的功能和Sun studio里面所带的dbx非常相似,但 jdb是专门用来针对Java应用程序的。

 

jstat– jstat利用了JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控等等。

 

jps– jps是用来查看JVM里面所有进程的具体状态, 包括进程ID,进程启动的路径等等。

 



推荐:

jconsole

jstat



jmap(linux下特有,也是很常用的一个命令)
观察运行中的jvm物理内存的占用情况。
参数如下:
-heap:打印jvm heap的情况
-histo:打印jvm heap的直方图。其输出信息包括类名,对象数量,对象占用大小。
-histo:live :同上,但是只答应存活对象的情况
-permstat:打印permanent generation heap情况

命令使用:
jmap -heap 2083
可以观察到New Generation(Eden Space,From Space,To Space),tenured generation,Perm Generation的内存使用情况
输出内容:
 



jmap -histo 2083 | jmap -histo:live 2083
可以观察heap中所有对象的情况(heap中所有生存的对象的情况)。包括对象数量和所占空间大小。
输出内容:
 


写个脚本,可以很快把占用heap最大的对象找出来,对付内存泄漏特别有效。







[root@tc130 bin]# jmap -heap 8208
Attaching to process ID 8208, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 19.1-b02

using parallel threads in the new generation.
using thread-local object allocation.
Concurrent Mark-Sweep GC

Heap Configuration:
   MinHeapFreeRatio = 40
   MaxHeapFreeRatio = 70
   MaxHeapSize      = 2147483648 (2048.0MB)
   NewSize          = 268435456 (256.0MB)
   MaxNewSize       = 268435456 (256.0MB)
   OldSize          = 5439488 (5.1875MB)
   NewRatio         = 2
   SurvivorRatio    = 5
   PermSize         = 21757952 (20.75MB)
   MaxPermSize      = 85983232 (82.0MB)

Heap Usage:
New Generation (Eden + 1 Survivor Space):           ========>  (= Eden Space + From Space)
   capacity = 230096896 (219.4375MB)
   used     = 97320504 (92.81206512451172MB)
   free     = 132776392 (126.62543487548828MB)
   42.29544408978033% used
Eden Space:                                        =======> Eden Space (heap): 内存最初从这个内存池分配给大部分对象。
   capacity = 191758336 (182.875MB)
   used     = 86089392 (82.10124206542969MB)
   free     = 105668944 (100.77375793457031MB)
   44.894732503310834% used
From Space:                                        ========> Survivor Space (heap):用于保存在eden space内存池中经过垃圾回收后没有被回收的对象。
   capacity = 38338560 (36.5625MB)
   used     = 11231112 (10.710823059082031MB)
   free     = 27107448 (25.85167694091797MB)
   29.294558794070515% used
To Space:                                          ========>  另一个Survivor Space (heap)
   capacity = 38338560 (36.5625MB)
   used     = 0 (0.0MB)
   free     = 38338560 (36.5625MB)
   0.0% used
concurrent mark-sweep generation:                 ========>   Old/Tenured Generation (heap):用于保持已经在 survivor space内存池中存在了一段时间的对象。
   capacity = 1879048192 (1792.0MB)
   used     = 1112082360 (1060.5643844604492MB)
   free     = 766965832 (731.4356155395508MB)
   59.183280382837566% used
Perm Generation:                                  ========> Permanent Generation (non-heap):  保存虚拟机自己的静态(refective)数据,例如类(class)
                                                              和方法(method)对象。  Java虚拟机共享这些类数据。这个区域被分割为只读的和只写的,
   capacity = 75022336 (71.546875MB)
   used     = 44927840 (42.846527099609375MB)
   free     = 30094496 (28.700347900390625MB)
   59.885951831731816% used


这里的数值和JConsole的数值做比较,是相符的,具体见JConsole的"内存"标签。


还有:
Code Cache (non-heap):HotSpot Java虚拟机包括一个用于编译和保存本地代码(native code)的内存,叫做“代码缓存区”(code cache)




全部内容详见附件:Java_内存泄露监控工具.rar(1.65 MB)

TAG:

 

评分:0

我来说两句

Open Toolbar