JVM的内存调优工具

JVM自带了一些比较好用的工具,比如jstat,jmap等。

jstat -gc pid

可以查看某个进程的gc次数。每列的含义如下

字段 含义
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 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)

jmap -heap pid

可以查看内存中各个代(新生代,老年代和永久代)的大小配置以及使用情况。比如

Attaching to process ID 31523, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.65-b04

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

Heap Configuration:
   MinHeapFreeRatio = 40
   MaxHeapFreeRatio = 70
   MaxHeapSize      = 2684354560 (2560.0MB)
   NewSize          = 1342177280 (1280.0MB)
   MaxNewSize       = 1342177280 (1280.0MB)
   OldSize          = 5439488 (5.1875MB)
   NewRatio         = 2
   SurvivorRatio    = 4
   PermSize         = 83886080 (80.0MB)
   MaxPermSize      = 167772160 (160.0MB)
   G1HeapRegionSize = 0 (0.0MB)

Heap Usage:
New Generation (Eden + 1 Survivor Space):
   capacity = 1118502912 (1066.6875MB)
   used     = 1071778952 (1022.128059387207MB)
   free     = 46723960 (44.55944061279297MB)
   95.82263403172972% used
Eden Space:
   capacity = 894828544 (853.375MB)
   used     = 894828544 (853.375MB)
   free     = 0 (0.0MB)
   100.0% used
From Space:
   capacity = 223674368 (213.3125MB)
   used     = 176950408 (168.75305938720703MB)
   free     = 46723960 (44.55944061279297MB)
   79.11072224422246% used
To Space:
   capacity = 223674368 (213.3125MB)
   used     = 0 (0.0MB)
   free     = 223674368 (213.3125MB)
   0.0% used
concurrent mark-sweep generation:
   capacity = 1342177280 (1280.0MB)
   used     = 1342177128 (1279.999855041504MB)
   free     = 152 (1.4495849609375E-4MB)
   99.99998867511749% used
Perm Generation:
   capacity = 83886080 (80.0MB)
   used     = 22813536 (21.756683349609375MB)

jmap -histo pid

统计内存中每个对象占用的大小。
还可以带上参数live: jmap -histo:live pid,这样就只统计当前依然存活的对象。


JVM的内存调优工具_第1张图片
image.png

[ 表示是一个数组
C: char
B: byte
I: int

jmap -dump 配合eclipse的memory analyzer tool

jmap -dump:format=b,file=dump.hprof pid
这个命令可以把当前的内存dump到文件,然后通过eclipse的memory analyzer tool,可以分析这个dump,检测可能的内存泄漏等。

如果dump文件过大,mat加载时候会报错

An internal error occurred during:
"Parsing heap dump from **\java_pid6564.hprof'".Java heap space

可以把MemoryAnalyzer.ini里面的-Xmx1024m改为更大的数即可解决。

你可能感兴趣的:(JVM的内存调优工具)