昨天学习了三个JVM常用命令:jps、jstat、jinfo,今天学习jmap、jstack这两个命令。
jmap jmap命令常用于生成heap dump文件,还可以使用**-XX:+HeapDumpOnOutOfMemoryError和 -XX:+heapDumpPath**配合使用,当发生OOM时,将heap信息dump指定文件中。
jmap不仅可以dump出heap信息,还可以查询Java堆和永久代的详细信息,如当前使用的是哪种垃圾收集器等。
使用格式: 
option参数:
dump : 生成堆转储快照 
finalizerinfo : 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象 
heap : 显示Java堆详细信息 
histo : 显示堆中对象的统计信息 
permstat : to print permanent generation statistics 
F : 当-dump没有响应时,强制生成dump快照 
 
 
举个栗子: -dump 1 jmap -dump:live,format=b,file=filename pid 
dump堆到文件,format指定输出格式,live指明是活着的对象,file指定文件名
1 2 3 jmap -dump:live,format=b,file=dump.dump 20828 Dumping heap to /home/tomcat/dump.hprof ... Heap dump file created 
-finalizerinfo 打印等待回收对象的信息:
1 2 3 4 5 6 jmap -finalizerinfo 20828 Attaching to process ID 20828, please wait... Debugger attached successfully. Server compiler detected. JVM version is 23.25-b01 Number of objects pending for finalization: 0 
-heap 打印heap概要信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 jmap -heap 20828 Attaching to process ID 20828, please wait... Debugger attached successfully. Server compiler detected. JVM version is 23.25-b01 using thread-local object allocation. Mark Sweep Compact GC Heap Configuration:       #堆内存初始化配置    MinHeapFreeRatio = 40  #对应jvm启动参数-XX:MinHeapFreeRatio设置JVM堆最小空闲比率(default 40)    MaxHeapFreeRatio = 70  #对应jvm启动参数 -XX:MaxHeapFreeRatio设置JVM堆最大空闲比率(default 70)    MaxHeapSize      = 1073741824 (1024.0MB) #对应jvm启动参数-XX:MaxHeapSize=设置JVM堆的最大大小    NewSize          = 1310720 (1.25MB)      #对应jvm启动参数-XX:NewSize=设置JVM堆的‘新生代’的默认大小    MaxNewSize       = 17592186044415 MB     #对应jvm启动参数-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小    OldSize          = 5439488 (5.1875MB)    #对应jvm启动参数-XX:OldSize=设置JVM堆的‘老生代’的大小    NewRatio         = 2      #对应jvm启动参数-XX:NewRatio=:‘新生代’和‘老生代’的大小比率    SurvivorRatio    = 8      #对应jvm启动参数-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值  默认8:1:1    PermSize         = 67108864 (64.0MB) #对应jvm启动参数-XX:PermSize=设置JVM堆的‘永生代’的初始大小    MaxPermSize      = 268435456 (256.0MB)#对应jvm启动参数-XX:PermSize=设置JVM堆的‘永生代’的最大值    G1HeapRegionSize = 0 (0.0MB) Heap Usage:  #堆使用情况 New Generation (Eden + 1 Survivor Space):    capacity = 79298560 (75.625MB)    used     = 53412648 (50.938270568847656MB)    free     = 25885912 (24.686729431152344MB)    67.35639083483987% used Eden Space:    capacity = 70516736 (67.25MB)    used     = 53412648 (50.938270568847656MB)    free     = 17104088 (16.311729431152344MB)    75.74464025107459% used From Space:    capacity = 8781824 (8.375MB)    used     = 0 (0.0MB)    free     = 8781824 (8.375MB)    0.0% used To Space:    capacity = 8781824 (8.375MB)    used     = 0 (0.0MB)    free     = 8781824 (8.375MB)    0.0% used tenured generation:    capacity = 176041984 (167.88671875MB)    used     = 99224448 (94.6278076171875MB)    free     = 76817536 (73.2589111328125MB)    56.36408187719584% used Perm Generation:    capacity = 73334784 (69.9375MB)    used     = 73134520 (69.74651336669922MB)    free     = 200264 (0.19098663330078125MB)    99.72691812932864% used 26706 interned Strings occupying 3092160 bytes. 
jstack jstack书上说是用于生成JVM当前时刻的线程快照,可以用来分析线程停顿时间长、死锁的原因,看到有问题的线程在后台执行什么操作,或是在等待什么资源。
命令格式 
option分析 
-F : 当正常输出请求不被响应时,强制输出线程堆栈 
-l : 除堆栈外,显示关于锁的附加信息 
-m : 如果调用到本地方法的话,可以显示C/C++的堆栈 
 
 
关于jstack命令的学习,暂时在脑海里有这个印象,以后项目中用到后会结合实际去理解、分析。