您的位置:首页 > 编程语言 > Java开发

Java常用分析工具之jmap

2016-08-11 17:29 417 查看


简介

jmap是JDK中提供的一个用来监视进程运行中的jvm物理内存的占用情况的工具。该进程内存内,所有对象的情况,例如产生了哪些对象,对象数量。当系统崩溃时,jmap 可以从core文件或进程中获得内存的具体匹配情况,包括Heap size, Perm size等。

使用jmap会影响线上运行的应用,所以尽量不要在线上执行此命令。如果想dump堆信息,可以使用gcore命令,比jmap -dump快。


使用

jmap的使用很简单,可以通过以下命令查看。
jmap -h
Usage:
jmap [option] <pid>
(to connect to running process)
jmap [option] <executable <core>
(to connect to a core file)
jmap [option] [server_id@]<remote server IP or hostname>
(to connect to remote debug server)
.......


案例


查看堆heap占用情况

jmap -heap 90099
Attaching to process ID 90099, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.71-b01

using thread-local object allocation.
Parallel GC with 4 thread(s)  #垃圾回收的方式

Heap Configuration: #堆配置信息
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize      = 2147483648 (2048.0MB)
NewSize          = 1310720 (1.25MB)
MaxNewSize       = 17592186044415 MB
OldSize          = 5439488 (5.1875MB)
NewRatio         = 2
SurvivorRatio    = 8
PermSize         = 21757952 (20.75MB)
MaxPermSize      = 85983232 (82.0MB)
G1HeapRegionSize = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
capacity = 34603008 (33.0MB)
used     = 9773032 (9.320289611816406MB)
free     = 24829976 (23.679710388183594MB)
28.24330185398911% used
From Space:
capacity = 5242880 (5.0MB)
used     = 0 (0.0MB)
free     = 5242880 (5.0MB)
0.0% used
To Space:
capacity = 5242880 (5.0MB)
used     = 0 (0.0MB)
free     = 5242880 (5.0MB)
0.0% used
PS Old Generation
capacity = 89128960 (85.0MB)
used     = 0 (0.0MB)
free     = 89128960 (85.0MB)
0.0% used
PS Perm Generation
capacity = 22020096 (21.0MB)
used     = 2666808 (2.5432662963867188MB)
free     = 19353288 (18.45673370361328MB)
12.110791887555804% used

677 interned Strings occupying 44048 bytes.


查看对象占用内存情况

$ jmap -histo:live 96176

num     #instances         #bytes  class name
----------------------------------------------
1:          5948         766656  <methodKlass>
2:          5948         679168  <constMethodKlass>
3:           401         474448  <constantPoolKlass>
4:           365         289664  <constantPoolCacheKlass>
5:           401         276112  <instanceKlassKlass>
6:           562          93176  [B
7:           900          86256  [C
8:           463          45328  java.lang.Class
9:           653          43216  [[I
10:           608          37144  [S
11:            45          24480  <objArrayKlassKlass>


输出内容的一些说明:

[C is a char[]

[S is a short[]

[I is a int[]

[B is a byte[]

[[I is a int[][]

上面的输出中[C对象占用Heap这么多,往往跟String有关,String其内部使用final char[]数组来保存数据的。

constMethodKlass/ methodKlass/ constantPoolKlass/ constantPoolCacheKlass/ instanceKlassKlass/ methodDataKlass

与Classloader相关,常驻与Perm区。


导出堆信息

可以使用jmap把堆信息导出,并使用可视化工具mat分析。导出的命令如下:
$ jmap -dump:format=b,file=a.dmp 96185
Dumping heap to /Users/canglong/dev/test/a.dmp ...
Heap dump file created



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: