Java内存分析工具

这段时间单机跑一个大java,总是出现Heap OutOfMemory,无奈了,于是搜了下java自带的内存分析工具,算是初学了,记录一下,主要包括jmap, jstat, jps, jconsole,看不懂的可以参考我之前写的一篇关于java内存管理的文章

 

jmap  

打印出某个java进程(使用pid)内存内的,所有‘对象’的情况(如:产生那些对象,及其数量)。 
 

例1:堆使用情况

jmap -heap 22677 | more
Attaching to process ID 22677, please wait…
Debugger attached successfully.
Server compiler detected.
JVM version is 1.5.0_15-b04
 
using thread-local object allocation.
Parallel GC with 4 thread(s)
 
Heap Configuration:
   MinHeapFreeRatio = 40
   MaxHeapFreeRatio = 70
   MaxHeapSize      = 6442450944 (6144.0MB)
   NewSize          = 2686976 (2.5625MB)
   MaxNewSize       = -65536 (-0.0625MB)
   OldSize          = 1835008 (1.75MB)
   NewRatio         = 2
   SurvivorRatio    = 8
   PermSize         = 21757952 (20.75MB)
   MaxPermSize      = 88080384 (84.0MB)
 
Heap Usage:
PS Young Generation
Eden Space:
   capacity = 854327296 (814.75MB)
   used     = 854327296 (814.75MB)
   free     = 0 (0.0MB)
   100.0% used
From Space:
   capacity = 642121728 (612.375MB)
   used     = 0 (0.0MB)
   free     = 642121728 (612.375MB)
   0.0% used
To Space:
   capacity = 646578176 (616.625MB)
   used     = 0 (0.0MB)
   free     = 646578176 (616.625MB)
   0.0% used
PS Old Generation
   capacity = 4294967296 (4096.0MB)
   used     = 4294967296 (4096.0MB)
   free     = 0 (0.0MB)
   100.0% used
PS Perm Generation
   capacity = 21757952 (20.75MB)
   used     = 14759800 (14.076042175292969MB)
   free     = 6998152 (6.673957824707031MB)
   67.8363478327372% use
 

例2:堆的快照

jmap -histo 22677 > out
 
 

jstat   

一个极强的监视VM内存工具。可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量。   
 

例3:GC情况

[work@db-beidou-rd02.db01.baidu.com bin]$ jstat -gccapacity 22677
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC      PGCMN    PGCMX     PGC       PC     YGC    FGC 
349504.0 2097152.0 2097152.0 627072.0 631424.0 834304.0   699072.0  4194304.0  4194304.0  4194304.0  21248.0  86016.0  21248.0  21248.0     72    55
 

例4:GC情况,每隔5秒钟打印一次

jstat -gcutil 22677 5000 (5秒打印一次)
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   
  0.00   0.00 100.00 100.00  67.84     72   42.522    49  690.569  733.091
  0.00   0.00 100.00 100.00  67.84     72   42.522    50  705.612  748.134
  0.00   0.00 100.00 100.00  67.84     72   42.522    50  705.612  748.134
  0.00   0.00 100.00 100.00  67.84     72   42.522    50  705.612  748.134
  0.00   0.00 100.00 100.00  67.84     72   42.522    51  720.629  763.151
  0.00   0.00 100.00 100.00  67.84     72   42.522    51  720.629  763.151
  0.00   0.00 100.00 100.00  67.84     72   42.522    51  720.629  763.151
  0.00   0.00 100.00 100.00  67.84     72   42.522    52  735.667  778.189
  0.00   0.00 100.00 100.00  67.84     72   42.522    52  735.667  778.189
  0.00   0.00 100.00 100.00  67.84     72   42.522    52  735.667  778.189
S0 — Heap上的 Survivor space 0 区已使用空间的百分比
S1 — Heap上的 Survivor space 1 区已使用空间的百分比
E   — Heap上的 Eden space 区已使用空间的百分比
O   — Heap上的 Old space 区已使用空间的百分比
P   — Perm space 区已使用空间的百分比
YGC — 从应用程序启动到采样时发生 Young GC 的次数
YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒)
FGC — 从应用程序启动到采样时发生 Full GC 的次数
FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒)
GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)
 
 
 

jps   

与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。 
 

例5:查看系统有多少java在运行

[work@db-beidou-rd02.db01.baidu.com bin]$ jps
22677 SiteUsercountUtility
26038 Jps 
 
 

jconsole  

一个java GUI监视工具,可以以图表化的形式显示各种数据。并可通过远程连接监视远程的服务器VM。 

Leave a Comment.