第四章 虚拟机性能监控与排障
时间:2023-06-28 02:21:01 | 来源:网站运营
时间:2023-06-28 02:21:01 来源:网站运营
第四章 虚拟机性能监控与排障:
将来的你,一定会感谢现在拼命的自己。
一、概述
实际工作中从实践的角度给一个系统定位问题的时候,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。
这里说的数据包括:
- 运行日志
- 异常堆栈
- GC日志
- 线程快照( threaddump/javacore 文件)
- 堆转储快照(heapdump/hprof文件)等
经常使用适当的虚拟机监控和分析的工具可以加快我们分析数据、定位解决问题的速度,但在学习工具前,也应当意识到工具永远都是知识技能的一层包装,没有什么工具是“秘密武器”,不可能学会了就能包治百病。
二、JDK的命令行工具
Java开发人员肯定都知道 JDK的 bin 目录中有“java.exe”、“javac.exe”这两个命令行工具。每逢JDK更新版本之时,bin目录下命令行工具的数量和功能总会不知不觉地增加和增强。这些工具都非常稳定而且功能强大,能在处理应用程序性能问题、定位故障时发挥作用。
- JDK的这些工具的程序体积都异常小巧,几乎所有工具的体积基本上都稳定在 27KB左右。
- 这些命令行工具大多数是jdk/lib/tools.jar类库的一层薄包装而已,它们主要的功能代码是在tools 类库中实现的
- 这些工具中很多甚至就是由 Shell 脚本直接写成的,可以用vim 直接打开它们。
JDK 开发团队选择采用 Java 代码来实现这些监控工具是有特别用意的:当应用程序部署的生产环境后,无论是直接接触物理服务器还是远程Telnet 到服务器上都可能会受到限制 toolsjar 类库里面的接口,我们可以直接在应用程序中实现功能强大的监控分析功能。
使用细节可以针对性网上搜索,先构建知识框架!!!
1.jps:虚拟机进程状况工具
命令格式:jps [options ] [ hostid ]
我们可以使用 jps -help 查看具体用法
- -q:只输出进程 ID
- -m:输出传入 main 方法的参数
- -l:输出完全的包名,应用主类名,jar的完全路径名
- -v:输出jvm参数
- -V:输出通过flag文件传递到JVM中的参数
2.jstat:虚拟机统计信息监视工具
命令格式:jstat [ option vmid [interval [s|ms] [count] ] ]
我们可以使用 jstat -help 查看具体用法
- -gc 监视Java堆状况,包括Eden区、2个Survivor区、老年代、永久代等容量。已用空间,垃圾收集时间合计等信息
- -gccapacity 监视内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大、最小空间
- -gcutil 监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比
- -gccause 与-gcutil功能一样,但是会额外输出导致上一次垃圾收集产生的原因
- -gcnew 显示新生代统计信息
- -gcnewcapacity 统计新生代及内存使用情况,输出主要关注使用到的最大、最小空间
- -gcold 统计老年代和元空间使用情况
- -gcoldcapacity 统计老年代内存使用情况,输出主要关注使用到的最大、最小空间
- -gcmetacapacity 统计元空间使用情况
- -printcompilation 输出已经被及时编译的方法
- -compiler 输出及时编译器编译过的方法、耗时等信息
- -class 监视类加载、卸载数量、总空间以及类装载所耗时间
- -gcpermcapacity 输出永久代的最大、最小空间 (JDK1.8已经完全移除永久代)
3.jinfo:Java配置信息工具
命令格式:jinfo [ option ] pid
我们可以使用 jinfo -help 查看具体用法
- -flag name 打印给定参数的键值对。
- -flag [+|-]name 使给定的命令行参数可用或不可用。
- -flag name=value 设置给定的命令行参数的值为指定的值。
- -flags 打印传递给 JVM 的参数。
- -sysprops 打印以键值对表示的 Java 系统属性。
- -h, -help 打印帮助信息
4.jmap:Java内存映射工具
命令格式 jmap [ option] vmid
我们可以用jmap -help 查看具体用法
- dump 生成Java堆转储快照。
- finalizerinfo 显示在F-Queue中等待Finalizer线程执行finalize方法的对象,只在Linux/Solaris平台下有效。
- heap 显示Java堆详细信息,如使用哪种回收器、参数配置 、分代状况等。只在linux/Solaris平台下有效。
- histo 显示堆中对象统计信息,包括类、实例数量、合计容量。
- permstat 以ClassLoader为统计口径显示永久代内存状态,只在Linux/Solaris平台下有效。
- F 当虚拟机进程对-dump选项没有响应时,可使用这个选项强制生成dump快照,只在Linux/Solaris平台下有效。
5.jhat:虚拟机堆转储快照分析工具
命令格式 jhat [options] heap-dump-file
我们可以用jhat -help 查看具体用法
- J< flag > 因为 jhat 命令实际上会启动一个JVM来执行, 通过 -J 可以在启动JVM时传入一些启动参数.
- -stack false true
- -refs false true
- -port port-number 设置 jhat HTTP server 的端口号. 默认值 7000。
- -exclude exclude-file 指定对象查询时需要排除的数据成员列表文件。
- -baseline exclude-file 指定一个基准堆转储(baseline heap dump)。
- -debug int 设置 debug 级别. 0 表示不输出调试信息。 值越大则表示输出更详细的 debug 信息。
- -version 启动后只显示版本信息就退出。
6.jstack:Java堆栈跟踪工具
命令格式 jstack [-l] pid
我们可以用jstack:-help 查看具体用法
- -F当正常输出的请求不被响应时,强制输出线程堆栈
- -l除堆栈外,显示关于锁的附加信息
- -m如果调用到本地方法的话,可以显示C/C++堆栈
7.HSDIS:JIT生成代码反汇编
HSDIS是sun推荐的HotSpot虚拟机JIT编译代码的反汇编插件,它包含在HotSpot虚拟机的源码中,但没有提供编译后的程序。HotSpot的-XX:PrintAssemBly指令可以调用它来把本地代码还原为汇编代码输出,同时还生成了一些注释。
三、JDK可视化工具
- JConsole:Java监视与管理 控制台
- VisualVM:多合一故障处理工具
- 阿里的Arthas
- jprofile