1. JDK工具
1.1 jmap(堆信息)
jmap打印制定进程、核心文件、远程调试服务器的共享对象内存映射或堆内存详细信息。
打印堆摘要信息,gc算法,堆配置和内存使用情况 jmap -heap 53884
-> % jmap -heap 53884Attaching to process ID 53884, please wait...Debugger attached successfully.Server compiler detected.JVM version is 25.91-b14using thread-local object allocation.Parallel GC with 4 thread(s)Heap Configuration: ## 堆配置MinHeapFreeRatio = 0 ## 最小堆使用比例MaxHeapFreeRatio = 100 ## 最大堆使用比例MaxHeapSize = 2147483648 (2048.0MB) ## 最大堆内存NewSize = 44564480 (42.5MB) ## 新生代内存MaxNewSize = 715653120 (682.5MB) ## 最大新生代内存OldSize = 89653248 (85.5MB) ## 老年代内存NewRatio = 2 ## 新生代比例SurvivorRatio = 8 ## 新生代与survivor比例MetaspaceSize = 21807104 (20.796875MB) ## 元空间大小(1.8以后使用元空间代替永久代)CompressedClassSpaceSize = 1073741824 (1024.0MB)MaxMetaspaceSize = 17592186044415 MBG1HeapRegionSize = 0 (0.0MB)Heap Usage: ## 堆使用PS Young Generation ## 新生代(eden + survivor1 + survivor2)Eden Space: ## 伊甸区capacity = 206569472 (197.0MB) ## 容量used = 68989976 (65.7939682006836MB) ## 已使用free = 137579496 (131.2060317993164MB) ## 剩余33.39795340136223% used ## 使用比例From Space: ## survivor1capacity = 14680064 (14.0MB)used = 0 (0.0MB)free = 14680064 (14.0MB)0.0% usedTo Space: ## survivor2capacity = 15204352 (14.5MB)used = 0 (0.0MB)free = 15204352 (14.5MB)0.0% usedPS Old Generation ## 老年代capacity = 81788928 (78.0MB)used = 22399976 (21.362281799316406MB)free = 59388952 (56.637718200683594MB)27.387540768354366% used19279 interned Strings occupying 2376736 bytes.
打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量. jmap -histo:live 53884
num #instances #bytes class name----------------------------------------------1: 52637 7948856 [C2: 17907 1575816 java.lang.reflect.Method3: 2947 1438304 [B4: 51541 1236984 java.lang.String5: 7556 842432 java.lang.Class6: 9354 488912 [Ljava.lang.Object;7: 15039 481248 java.util.concurrent.ConcurrentHashMap$Node8: 20265 449368 [Ljava.lang.Class;9: 12307 393824 java.util.HashMap$Node10: 3955 332848 [Ljava.util.HashMap$Node;11: 7445 297800 java.util.LinkedHashMap$Entry12: 3473 250056 java.lang.reflect.Field13: 3762 210672 java.util.LinkedHashMap
dump,另外通过-XX:+HeapDumpOnOutOfMemoryError参数,可以让虚拟机在内存溢出异常出现之后自动生成堆转储快照文件 jmap -dump:live,format=b,file=dump.hprof 53884
Dumping heap to /Users/dinozhang/dump.hprof ...Heap dump file created
1.2 jstack(线程信息)
1.3 jps (java进程)
1.4 jstat (统计信息gc class)
jstat -options help
-class-compiler-gc-gccapacity-gccause-gcmetacapacity-gcnew-gcnewcapacity-gcold-gcoldcapacity-gcutil-printcompilation
统计gc 2次间隔1s jstat -gc 53884 1000 2
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT15360.0 14848.0 0.0 0.0 286208.0 4006.9 93184.0 15353.2 38232.0 36316.5 4992.0 4653.6 11 0.187 4 0.470 0.65715360.0 14848.0 0.0 0.0 286208.0 4006.9 93184.0 15353.2 38232.0 36316.5 4992.0 4653.6 11 0.187 4 0.470 0.657
1.5 jinfo(配置信息)
jinfo -flags 53884
Attaching to process ID 53884, please wait...Debugger attached successfully.Server compiler detected.JVM version is 25.91-b14Non-default VM flags: -XX:-BytecodeVerificationLocal -XX:-BytecodeVerificationRemote -XX:CICompilerCount=3 -XX:InitialHeapSize=134217728 -XX:+ManagementServer -XX:MaxHeapSize=2147483648 -XX:MaxNewSize=715653120 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=44564480 -XX:OldSize=89653248 -XX:TieredStopAtLevel=1 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGCCommand line: -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:52287,suspend=y,server=n -XX:TieredStopAtLevel=1 -Xverify:none -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=52286 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true -javaagent:/Users/dinozhang/Library/Caches/IntelliJIdea2018.1/captureAgent/debugger-agent.jar=file:/private/var/folders/g1/tjkmk4995yl_10wswwy2snzc0000gp/T/capture.props -Dfile.encoding=UTF-8
1.6 jhat(堆快照分析工具)
1.7 jconsole (可视化分析工具)
1.8 jvisualvm (可视化分析工具)
- 显示虚拟机进程以及进程的配置、环境信息(jps、jinfo)。

- 监视应用程序的处理器、垃圾收集、堆、方法区以及线程的信息(jstat、jstack)。

- dump以及分析堆转储快照(jmap、jhat)。
2. 其他工具
2.1 MAT
2.2 Btrace
BTrace的用途很广泛,打印调用堆栈、参数、返回值只是它最基础的使用形式,在它的网站上有使用BTrace进行性能监视、定位连接泄漏、内存泄漏、解决多线程竞争问题等的使用案例,有兴趣的读者可以去网上了解相关信息。
BTrace能够实现动态修改程序行为,是因为它是基于Java虚拟机的Instrument开发的。Instrument是Java虚拟机工具接口(Java Virtual Machine Tool Interface,JVMTI)的重要组件,提供了一套代理(Agent)机制,使得第三方工具程序可以以代理的方式访问和修改Java虚拟机内部的数据
