1

1. 前言

  我的开源分析工具小笔记。

2. JDK原生的工具

2.1 jinfo

JDK提供的一个可以实时查看Java虚拟机各种配置参数和系统属性的命令行工具。

常见使用场景:

  1. 查看JVM默认配置参数;
  2. 查看修改的配置参数是否生效;
  3. 其他;
  • 用法:jinfo [参数] <pid>
参数作用示例
-flag <name>打印指定名称对应的配置参数jinfo -flag PrintGC 123 (查看PrintGC是否开启)
-flag [+,-]name启用或禁用指定名称的参数(指定的参数必须是Boolean类型)jinfo -flag +PrintGC 123 (开启PrintGC)
-flag name=valueJava虚拟机参数热修改,修改指定名称的参数为指定的值(java -XX:+PrintFlagsInitial命令显示标记为manageable的配置参数才能热修改)jinfo -flag MinHeapFreeRatio=30 123 (修改空闲堆空间的最小百分比为30)
-flags打印全部的配置参数jinfo -flags 123
-sysprops以键值对的方式打印当前Java虚拟机的全部的系统属性jinfo -sysprops 123
比较常用的flag name(部分): CICompilerCountConcGCThreadsG1HeapRegionSizeG1ReservePercent+HeapDumpOnOutOfMemoryError InitialHeapSizeMarkStackSizeMaxGCPauseMillisMaxHeapSizeMaxMetaspaceSizeMaxNewSizeMinHeapDeltaBytesUseCompressedClassPointersUseCompressedOopsUseFastUnorderedTimeStampsUseG1GCUseLargePagesIndividualAllocationUseParNewGCUseParallelOldGCUseParallelGCUseConcMarkSweepGC

2.2 jstack

线程快照,转储Java线程的栈信息(Thread Dump)。

常见使用场景:

  1. 响应时间RT高,TPS低,服务器资源消耗不高;
  2. 其他想要查看程序具体在做什么的场景;
  • 用法:jstack [参数] <pid>

    示例:jstack -m -l 123 > stack.log
参数作用
-F当正常输出的请求不被响应时(进程假死 hung住了),强制输出线程堆栈
-m显示C/C++的堆栈(如果存在本地方法调用)
-l示关于锁的附加信息,在遇到死锁时很方便排查问题

可以配合免费的可视化分析工具,比如IBM的Thread and Monitor Dump Analyzer for Java (TMDA),下载地址:https://www.ibm.com/support/p...

TMDA界面大致如下:
image.png

2.3 jmap

提供堆转储和其他JVM内存使用的信息。

常见使用场景:

  1. 内存使用很高或存在持续性增长趋势;
  2. Full GC频繁;
  3. 其他想查看实力对象信息的场景;
  • 用法:jmap [参数] <pid>
参数作用示例
-dump:[live,]format=b,file=/you/path/filename.hprof <pid>输出jvm的堆对象内容到指定文件。 live为可选项,代表是否只输出存活对象jmap -dump:format=b,live,file=heap.hprof 123
-finalizerinfo <pid>输出等待回收的对象信息。jmap -finalizerinfo 123
-heap <pid>输出当前java进程堆的概要信息,如GC算法,heap的配置空间等。jmap -heap 123
-histo[:live] <pid>输出当前class的实例数目、内存占用、类全名信息。jmap -histo:live 123 > minidump.log
-permstat <pid> or -clstats <pid>jdk8用-clstats,打印classload和jvm heap中perm代的信息,包含每个classloader的名字、活泼性、地址、父classloader和加载的class数量等信息。jmap -clstats 123

2.4 jhat

一般与jmap 配合使用,用于jvm内存快照分析,内置了一个HTTP/Web服务器,可以通过浏览器查看jmap生成的快照文件。

  • 用法:jhat [-stack <bool>] [-refs <bool>] [-port <port>] [-baseline <file>] [-debug <int>] [-version] [-h|-help] <heap-dump-file>

    示例:jhat heap.hprof
参数作用
-stack false\true是否关闭跟踪对象分配调用堆栈。默认为true,即打开。
-refs false\true是否关闭对象的引用跟踪。默认是true,即打开。
-port port-number设置jhat HTTP服务器的端口。默认是7000。
-exclude exclude-file指定一个文件,该文件列出应从可达对象查询中排除的数据成员。
-baseline exclude-file指定基线堆转储。用于对比两个不同的堆快照。
-debug int设置此工具的调试级别。0级别表示没有调试输出。想要更详细的调试级别,则需要设置更高的值。总共3个等级,分别为0、1、2
-version显示版本号
-Jflag将flag传递给正在运行jhat命令的Java虚拟机。比如:-J-mx512m,设置最大堆内存为512M
-h查看帮助信息。

2.5 jstat

用于查看JVM虚拟机中的类加载、内存、垃圾收集、即时编译等运行状态的信息。

  • 用法:jstat outputOptions [-t] [-h<lines>] <vmid> [<interval> [<count>]]

常见使用场景:

  1. 内存使用异常,监控GC情况;
  2. Full GC频繁;
  3. 想了解其他类如类加载,即时编译等信息;
参数作用示例
-class显示类加载、卸载数量、总空间和装载耗时的统计信息。jstat -class 123 1 5 (查看123进程,间隔1秒,输出5次)
-compiler显示即时编译的方法、耗时等信息。
-gc显示堆各个区域内存使用和垃圾回收的统计信息。
-gccapacity显示堆各个区域的容量及其对应的空间的统计信息。 (比-gc显示信息更多)
-gcutil显示有关垃圾收集统计信息的摘要。(按使用百分比显示)
-gccause显示关于垃圾收集统计信息的摘要(与-gcutil相同),以及最近和当前垃圾回收的原因。
-gcnew显示新生代的垃圾回收统计信息。
-gcnewcapacity显示新生代的大小及其对应的空间的统计信息。
-gcold显示老年代和元空间的垃圾回收统计信息。
-gcoldcapacity显示老年代的大小统计信息。
-gcmetacapacity显示元空间的大小的统计信息。
-printcompilation显示即时编译方法的统计信息。
输出字段含义参考:https://cloud.tencent.com/dev...

2.6 jcmd

JDK1.7以后新增的一个命令行工具。

  • 独有的功能是可以监控原生内存(native memory)的使用情况。
  • 和jmap、jstat、jstack、jinfo等命令存在功能上的交叉;
  • 使用参考:https://blog.csdn.net/weixin_...

2.7 jconsole

可视化监控工具,可用于连接正在运行的本地或者远程的JVM,对JVM资源消耗和性能进行监控。
官方文档:https://docs.oracle.com/javas...

2.8 jvisualvm

VisualVM可视化监控工具,可连接和监控本地和远程的JVM,能够监控线程,内存情况,查看方法的CPU时间和内存中的对象,功能比jconsole更加全面,并有丰富的第三方插件。
官方文档:https://docs.oracle.com/javas...

3. 其他开源工具

3.1 MAT

eclipse旗下开源JVM堆内存快照分析工具;
具体使用可参考:https://www.cnblogs.com/trust...

3.2 Arthas

基本包含了JDK自带工具所有的功能。除了没有美观的可视化界面外,分析功能真的上天。

有很多骚功能,比如:

  • 代码热修改
  • log级别热修改
  • 拦截方法传参和出参等

官方学习文档:http://arthas.gitee.io


开翻挖掘机
225 声望26 粉丝

不忘初心❤️,且行且思考