1. JDK工具

1.1 jmap(堆信息)

jmap打印制定进程、核心文件、远程调试服务器的共享对象内存映射或堆内存详细信息。

打印堆摘要信息,gc算法,堆配置和内存使用情况 jmap -heap 53884

  1. -> % jmap -heap 53884
  2. Attaching to process ID 53884, please wait...
  3. Debugger attached successfully.
  4. Server compiler detected.
  5. JVM version is 25.91-b14
  6. using thread-local object allocation.
  7. Parallel GC with 4 thread(s)
  8. Heap Configuration: ## 堆配置
  9. MinHeapFreeRatio = 0 ## 最小堆使用比例
  10. MaxHeapFreeRatio = 100 ## 最大堆使用比例
  11. MaxHeapSize = 2147483648 (2048.0MB) ## 最大堆内存
  12. NewSize = 44564480 (42.5MB) ## 新生代内存
  13. MaxNewSize = 715653120 (682.5MB) ## 最大新生代内存
  14. OldSize = 89653248 (85.5MB) ## 老年代内存
  15. NewRatio = 2 ## 新生代比例
  16. SurvivorRatio = 8 ## 新生代与survivor比例
  17. MetaspaceSize = 21807104 (20.796875MB) ## 元空间大小(1.8以后使用元空间代替永久代)
  18. CompressedClassSpaceSize = 1073741824 (1024.0MB)
  19. MaxMetaspaceSize = 17592186044415 MB
  20. G1HeapRegionSize = 0 (0.0MB)
  21. Heap Usage: ## 堆使用
  22. PS Young Generation ## 新生代(eden + survivor1 + survivor2
  23. Eden Space: ## 伊甸区
  24. capacity = 206569472 (197.0MB) ## 容量
  25. used = 68989976 (65.7939682006836MB) ## 已使用
  26. free = 137579496 (131.2060317993164MB) ## 剩余
  27. 33.39795340136223% used ## 使用比例
  28. From Space: ## survivor1
  29. capacity = 14680064 (14.0MB)
  30. used = 0 (0.0MB)
  31. free = 14680064 (14.0MB)
  32. 0.0% used
  33. To Space: ## survivor2
  34. capacity = 15204352 (14.5MB)
  35. used = 0 (0.0MB)
  36. free = 15204352 (14.5MB)
  37. 0.0% used
  38. PS Old Generation ## 老年代
  39. capacity = 81788928 (78.0MB)
  40. used = 22399976 (21.362281799316406MB)
  41. free = 59388952 (56.637718200683594MB)
  42. 27.387540768354366% used
  43. 19279 interned Strings occupying 2376736 bytes.

打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量. jmap -histo:live 53884

  1. num #instances #bytes class name
  2. ----------------------------------------------
  3. 1: 52637 7948856 [C
  4. 2: 17907 1575816 java.lang.reflect.Method
  5. 3: 2947 1438304 [B
  6. 4: 51541 1236984 java.lang.String
  7. 5: 7556 842432 java.lang.Class
  8. 6: 9354 488912 [Ljava.lang.Object;
  9. 7: 15039 481248 java.util.concurrent.ConcurrentHashMap$Node
  10. 8: 20265 449368 [Ljava.lang.Class;
  11. 9: 12307 393824 java.util.HashMap$Node
  12. 10: 3955 332848 [Ljava.util.HashMap$Node;
  13. 11: 7445 297800 java.util.LinkedHashMap$Entry
  14. 12: 3473 250056 java.lang.reflect.Field
  15. 13: 3762 210672 java.util.LinkedHashMap

dump,另外通过-XX:+HeapDumpOnOutOfMemoryError参数,可以让虚拟机在内存溢出异常出现之后自动生成堆转储快照文件 jmap -dump:live,format=b,file=dump.hprof 53884

  1. Dumping heap to /Users/dinozhang/dump.hprof ...
  2. Heap dump file created

1.2 jstack(线程信息)

1.3 jps (java进程)

1.4 jstat (统计信息gc class)

jstat -options help

  1. -class
  2. -compiler
  3. -gc
  4. -gccapacity
  5. -gccause
  6. -gcmetacapacity
  7. -gcnew
  8. -gcnewcapacity
  9. -gcold
  10. -gcoldcapacity
  11. -gcutil
  12. -printcompilation

统计gc 2次间隔1s jstat -gc 53884 1000 2

  1. S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
  2. 15360.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
  3. 15360.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

  1. Attaching to process ID 53884, please wait...
  2. Debugger attached successfully.
  3. Server compiler detected.
  4. JVM version is 25.91-b14
  5. Non-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:+UseParallelGC
  6. Command 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)。

image.png

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

image.png

  • dump以及分析堆转储快照(jmap、jhat)。

image.png

2. 其他工具

2.1 MAT

2.2 Btrace

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

2.3 Arthas(阿尔萨斯)