在JDK的命令行中,一般开发人员最耳熟能详的肯定就是java,javac,javap等常用命令,不过在jdk/bin下还有许多其他的命令行工具,它们被用来监测JVM运行时的状态,下面我们来详细解读一下几个常用的工具以及如何使用。
jmap jmap(JVM Memory Map)命令用于生成heap dump文件,如果不使用这个命令,还阔以使用-XX:+HeapDumpOnOutOfMemoryError参数来让虚拟机出现OOM的时候·自动生成dump文件。 jmap不仅能生成dump文件,还阔以查询finalize执行队列、Java堆和永久代的详细信息,如当前使用率、当前使用的是哪种收集器等。
命令格式 jmap [option] LVMID
option参数
-dump : 生成堆转储快照
-finalizerinfo : 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象
-heap : 显示Java堆详细信息
-histo : 显示堆中对象的统计信息
-clstats : 显示元空间内存状态,ps:该口令是JDK8开始使用,之前是-permstat
-F : 当-dump没有响应时,强制生成dump快照
示例 -dump 1 2 3 $ jmap -dump:live,format=b,file=dump.hprof 45995 Dumping heap to /Users/apple/dump.hprof ... Heap dump file created
live表示只dump出当前存活的对象,dump.hprof这个后缀是为了后续可以直接用MAT(Memory Anlysis Tool)打开。
-finalizerinfo 1 2 3 4 5 6 $ jmap -finalizerinfo 45995 Attaching to process ID 45995 , please wait.... Debugger attached successfully. Server compiler detected. JVM version is 25.45 -b02 Number of objects pending for finalization:0 .
可以看到当前F-QUEUE队列中并没有等待Finalizer线程执行finalizer方法的对象。
-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 $ jmap -heap 45995 ttaching to process ID 45995 , please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.45 -b02 using thread-local object allocation. Parallel GC with 8 thread(s) Heap Configuration: Min HeapFreeRatio = 0 MaxHeapFreeRatio = 100 MaxHeapSize = 4294967296 (4096.0 MB) NewSize = 89128960 (85.0 MB) MaxNewSize = 1431306240 (1365.0 MB) OldSize = 179306496 (171.0 MB) NewRatio = 2 SurvivorRatio = 8 MetaspaceSize = 21807104 (20.796875 MB) CompressedClassSpaceSize = 1073741824 (1024.0 MB) MaxMetaspaceSize = 17592186044415 MB G1HeapRegionSize = 0 (0.0 MB) Heap Usage: PS Young Generation Eden Space: capacity = 527433728 (503.0 MB) used = 15639632 (14.915115356445312 MB) free = 511794096 (488.0848846435547 MB) 2.9652316812018515 % used From Space: capacity = 57147392 (54.5 MB) used = 0 (0.0 MB) free = 57147392 (54.5 MB) 0.0 % used To Space: capacity = 56623104 (54.0 MB) used = 0 (0.0 MB) free = 56623104 (54.0 MB) 0.0 % used PS Old Generation capacity = 153092096 (146.0 MB) used = 36103888 (34.43135070800781 MB) free = 116988208 (111.56864929199219 MB) 23.583116923293023 % used
可以很清楚的看到Java堆中各个区域目前的情况。
高能tips jmap –histo:live LVMID 这个命令可以显示出当前存活的对象信息,不过加live关键字会强制做1次FULL GC,如果系统有watch dog的存在很可能导致服务器重启。
jmap -heap 这个命令在CMS下会有几率导致进程traced(中断),所以强烈建议不要在生产环境使用这个命令,如果想要查看堆使用情况可以用jstat。