首页 > 深入理解Java虚拟机 > 正文

[总结]-第四章 虚拟机性能监控与故障处理工具

佛若2018-09-120人围观

[总结]-第四章 虚拟机性能监控与故障处理工具

进入JDK安装目录

  1. cd $JAVA_HOME/bin
  2. ls

输出

  1. appletviewer javah jjs jvisualvm schemagen
  2. extcheck javap jmap keytool serialver
  3. idlj javapackager jmc native2ascii servertool
  4. jar jcmd jps orbd tnameserv
  5. jarsigner jconsole jrunscript pack200 unpack200
  6. java jdb jsadebugd policytool wsgen
  7. javac jdeps jstack rmic wsimport
  8. javadoc jhat jstat rmid xjc
  9. javafxpackager jinfo jstatd rmiregistry
名称 主要作用
jps JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程
jstat JVM Statistics Monitoring Tool,用于收集HotSpot虚拟机各方面的运行数据
jinfo Configuration Info for Java,显示虚拟机配置信息
jmap Memory Map for Java,生成虚拟机的内存转出快照(heapdump文件)
jhat JVM Heap Dump Browser,分析heapdump文件,可以在浏览器查看结果
jstack stack trace for java,显示虚拟机的线程快照
jconsole Java监视与管理控制台
jvisualvm 多合一故障处理工具

jps

  1. jps

输出

  1. 1794 Jps
  2. 1410
  3. 1478 Launcher ---> 这是IDEA工具启动的服务
  4. 1479 DemoStartApplication ---> 这是目标Java服务
  5. 1230 Bootstrap

可以得知,当前的java服务的本地虚拟机唯一ID(LVMID)

选项 作用
-q 只输出LVMID
-m 输出虚拟机进程启动时传递给主类main()函数的参数
-l 输出主类全名,如果进程执行的事jar包,输出jar路径
-v 输出虚拟机进程启动时JVM参数

比较常用的是 jpsjps -v

jstat

  1. # option=操作,interval=间隔时间,count=操作次数
  2. jstat [option] vmid [interval] [count]

例如

  1. jstat -gc 1479 250 2

输出

  1. S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
  2. 41984.0 41472.0 0.0 0.0 810496.0 130073.9 271872.0 53990.9 71552.0 67042.8 8320.0 7480.3 19 0.259 5 0.845 1.104
  3. 41984.0 41472.0 0.0 0.0 810496.0 130073.9 271872.0 53990.9 71552.0 67042.8 8320.0 7480.3 19 0.259 5 0.845 1.104

常见参数

选项 作用
-class 类装载数量、卸载数量、总空间以及类状态所消耗时间
-gc 监视Java堆容量状况,包括Eden、survivor、老年代、永久代等
-gccapacity 监视Java堆最大、最小空间
-gcutil 关注已使用空间占总空间的百分比
-gccause 类似gcutil,额外输出上次GC的原因
-gcnew 新生代GC状况
-gcnewcapacity 与-gcnew类似,输出主要关注使用到的最大、最小空间
-gcold 老年代GC状况
-gcoldcapacity 与-gcold类似,输出主要关注使用到的最大、最小空间
-gcpermcapacity 输出永久代使用到的最大、最小空间
-compiler 输出JIT编译过的方法和耗时
-printcompilation 输出已经被JIT编译的方法
-gcmetacapacity 元数据空间统计

jinfo

实时查看调整虚拟机各项参数。

选项 作用 案例
-flag 调整虚拟机参数 jinfo -flag +PrintGCDetails 1479
-flags 查看指定进程所有参数 jinfo -flags 1479
-sysprops 打印虚拟机进程系统内容 jinfo -sysprops 1479
无参 打印所有 jinfo 1479

例如

  1. jinfo -flags 1479

输出

  1. Attaching to process ID 1479, please wait...
  2. Debugger attached successfully.
  3. Server compiler detected.
  4. JVM version is 25.144-b01
  5. Non-default VM flags: -XX:-BytecodeVerificationLocal -XX:-BytecodeVerificationRemote -XX:CICompilerCount=4 -XX:InitialHeapSize=268435456 -XX:+ManagementServer -XX:MaxHeapSize=4294967296 -XX:MaxNewSize=1431306240 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=89128960 -XX:OldSize=179306496 -XX:TieredStopAtLevel=1 -XX:+TraceClassLoading -XX:+TraceClassUnloading -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC
  6. Command line: -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:51774,suspend=y,server=n -Dvisualvm.id=12693776008746 -Dserver.port=9988 -XX:TieredStopAtLevel=1 -Xverify:none -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=51773 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true -Dfile.encoding=UTF-8

jmap

用于生成堆转储快照

  • jmap -dump 1479,输出1479虚拟机的堆转储快照。
  • -XX:+HeapDumpOnOutOfMemoryError 让虚拟机在出现OOM异常出现之后自动生成dump文件。
  • linux系统下通过Kill -3 命令发送进行退出信息“吓唬”虚拟机输出dump文件。
       选项        作用 案例
-dump 生成堆转储快照,格式为-dump:[live,]format=b,file=<filename>,不建议使用 jmap -dump:format=b,file=test 1479
-finalizerinfo 显示在F-Queue中等待Finalizer线程执行finalize方法的对象 jmap -finalizerinfo 1479
-heap 显示java堆详细信息,回收器种类、参数配置、分代状况等 jmap -heap 1479
-histo 显示堆中对象统计信息,包括类、实例数量、合计容量,不建议使用 jmap -histo:live 1479,会先触发GC,再统计信息
-permstat 查看永久代内存状态,比较耗时,会暂停应用,不建议使用 jmap -permstat 1479
-F 强制生成dump快照,当-dump失效时,再使用此命令 jmap -F 1479

例如

  1. jmap -dump:format=b,file=/Users/gy/Desktop/test 1479

输出(成功) - 输出的文件比较大,我这里有320M

  1. Dumping heap to /Users/gy/Desktop/test ...
  2. Heap dump file created

输出(失败) - 可以看出,没有权限访问,给目录权限或者换个有权限的目录。

  1. Dumping heap to /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/bin/test ...
  2. Permission denied

jhat

虚拟机堆转储快照分析工具,这里分析jmap堆转储快照的文件

  • 缺点:耗时、耗资源,一般不会再服务器上直接分析。一把使用其他工具,比如VisualVM。
  1. jhat /Users/gy/Desktop/test

输出

  1. Reading from /Users/gy/Desktop/test...
  2. Dump file created Tue Aug 28 15:59:30 CST 2018
  3. Snapshot read, resolving...
  4. Resolving 3208138 objects...
  5. Chasing references, expect 641 dots.......................
  6. Eliminating duplicate references..........................
  7. Snapshot resolved.
  8. Started HTTP server on port 7000
  9. Server is ready.

浏览器访问 http://localhost:7000

jstack

Java堆栈跟踪工具,生成虚拟机当前时刻的线程快照(当前虚拟机内每一条线程正在执行的方法堆栈集合)

主要目的:定位线程出现长时间停顿的原因,如线程间死锁死循环请求外部资源导致的长时间等待等。

选项 作用 案例
-m 如果调用本地方法,则显示C/C++的堆栈 jstack -m 1479
-l 除堆栈外,显示关于锁的附加信息 jstack -l 1479
-F 当正常输出的请求不被响应时,强制输出线程堆栈 jstack -F 1479

jconsole

  1. # 启动
  2. ./jconsole
  • 概览
    • 堆内存使用量
    • 线程
    • CPU占用率
  • 内存
    • 堆内存使用量
    • 非堆内存使用量(方法区)
    • 内存池“PS Old Gen”
    • 内存池“PS Eden Space”
    • 内存池“PS Survivor Space”
    • 内存池“Metaspace”
    • 内存池“Code Cache”
    • 内存池“Compressed Class Space”
  • 线程
    • 线程数图表
    • 所有线程
    • 检查死锁
    • 已加装当前类
    • 已加载类总数
    • 已卸载类总数
  • VM概要
  1. VM 概要
  2. 2018828 星期二 下午015933 CST
  3. 连接名称: pid: 1479 com.raising.modules.DemoStartApplication
  4. 虚拟机: Java HotSpot(TM) 64-Bit Server VM版本 25.144-b01
  5. 供应商: Oracle Corporation
  6. 名称: 1479@marshaldeMacBook-Pro.local
  7. 运行时间: 1 小时 47 分钟
  8. 进程 CPU 时间: 49.067
  9. JIT 编译器: HotSpot 64-Bit Tiered Compilers
  10. 总编译时间: 3.258
  11. 活动线程: 98
  12. 峰值: 101
  13. 守护程序线程: 34
  14. 启动的线程总数: 176
  15. 已加装当前类: 11,092
  16. 已加载类总数: 11,505
  17. 已卸载类总数: 413
  18. 当前堆大小: 129,701 KB
  19. 最大堆大小: 3,728,384 KB
  20. 提交的内存: 1,123,840 KB
  21. 暂挂最终处理: 0对象
  22. 垃圾收集器: 名称 = 'PS MarkSweep', 收集 = 5, 总花费时间 = 0.844
  23. 垃圾收集器: 名称 = 'PS Scavenge', 收集 = 19, 总花费时间 = 0.259
  24. 操作系统: Mac OS X 10.13.3
  25. 体系结构: x86_64
  26. 处理程序数: 8
  27. 提交的虚拟内存: 10,287,160 KB
  28. 总物理内存: 16,777,216 KB
  29. 空闲物理内存: 622,636 KB
  30. 总交换空间: 1,048,576 KB
  31. 空闲交换空间: 1,011,968 KB
  32. VM 参数: ...
  33. 类路径: ...
  34. 库路径: ...
  35. 引导类路径: ...
  • MBean

jvisualvm

  • OQL控制台
  • BTrace动态日志跟踪【插件】