文章目录
一、HotSpot参数分类
标准: - 开头,所有的HotSpot都支持
非标准:-X 开头,特定版本HotSpot支持特定命令
不稳定:-XX 开头,下个版本可能取消
-
java -XX:+PrintCommandLineFlags -version 观查虚拟机配置
-
java -XX:+PrintFlagsInitial 默认参数值
-
java -XX:+PrintFlagsFinal 最终参数值
-
java -XX:+PrintFlagsFinal | grep xxx 找到对应的参数
-
java -XX:+PrintFlagsFinal -version |grep GC
二、JPS 虚拟机进程状况工具
jps 命令格式:
jps [ options ] [ hostid ]
jps 工具主要选项:
-
-q: 只输出 LVMID,省略主类的名称
-
-m: 输出虚拟机进行启动时传递给主类 main() 函数的参数
-
-l: 输出主类的全名,如果进程执行的是 JAR 包,则输出 JAR 路径
-
-v: 输出虚拟机进程启动时的 JVM 参数
三、jstat 虚拟机统计信息监视工具
jstat ( JVM Statistics Monitoring Tool ) 是用于监视虚拟机各种运行状态信息的命令行工具。
jstat 命令格式:
jstat [ option vmid [ interval[s|ms] [count]] ]
参数 interval 和 count 代表查询间隔和次数,如果省略这两个参数,说明只查询一次。
如需要每1秒钟查询一次进行1234的垃圾收集情况,一共查询10次:
jstat -gc 1234 1000 10
jstat 工具主要选项:
-
-class: 监视类加载,卸载数量、总空间以及类装载所耗费的时间
-
-gc: 监视 Java 堆状况,包括 Eden 区、2个 Survivor 区、老年区、永久代等的容量,已用空间,垃圾收集时间合计等信息
-
-gccapacity: 监视内容与 -gc 基本相同,但输出主要关注 Java 堆各个区域使用到的最大、最小空间
-
-gcutil: 监视内容与 -gc 基本相同,但输出主要关注已使用空间占总空间的百分比
-
-gccause: 与 -gcutil功能一样,但是会额外输出导致上一次垃圾收集产生的原因
-
-gcnew: 监视新生代垃圾收集状况
-
-gcnewcapacity: 监视内容与 -gcnew 基本相同,输出主要关注使用到的最大、最小空间
-
-gcold: 监视老年代垃圾收集状况
-
-gcoldcapacity: 监视内容与 -gcold 基本相同,输出主要关注使用到的最大、最小空间
-
-gcpermcapacity: 输出永久代使用的最大、最小空间
-
-compiler: 输出即时编译器编译过的方法、耗时等信息
-
-printcompilation: 输出已经被即时编译的方法
四、jinfo Java 配置信息工具
jinfo( Configuration Info for Java ) 的作用是实时查看和调整虚拟机各项参数。
使用 jsp 命令的 -v 参数可以查看虚拟机启动时显示指定的参数列表,但如果想知道未被显示指定的参数的系统默认值,可以使用 jinfo 的 -flag 选项进行查询了( JDK 6 或以上版本,使用 Java -XX:+PrintFlagsFinal 查看参数默认值也是一个很好的选择)。
jinfo 还可以使用 -sysprops 选项把虚拟机进程的 System.getProperties() 的内容打印出来。
可以使用 -flag [+|-]name 或者 -flag name=value 在运行期修改一部分运行期可写的虚拟机参数值。
jinfo 命令格式:
jinfo [ option ] pid
如查询 ConcGCThreads 并发标记、并发整理的执行线程数值
jinfo -flag ConcGCThreads 1444
五、jmap Java 内存映像工具
jmap ( Memory Map for Java ) 命令用于生成堆转储快照(一般称为 heapdump 或 dump 文件),将VM 中的heap,以二进制输出成文本。
其它方式获得堆转储快照文件
-
-XX:+HeapDumpOnOutOfMemoryError
当OutOfMemoryError发生时自动生成 Heap Dump 文件。 -
-XX:+HeapDumpBeforeFullGC
当 JVM 执行 FullGC 前执行 dump。 -
-XX:+HeapDumpAfterFullGC
当 JVM 执行 FullGC 后执行 dump。 -
-XX:+HeapDumpOnCtrlBreak
交互式获取dump。在控制台按下快捷键Ctrl + Break时,JVM就会转存一下堆快照。 -
-XX:HeapDumpPath=/Users/apple/Downloads/test.hprof
指定 dump 文件存储路径。 -
在 Linux 系统下通过 Kill -3 命令发送进程退出信息号“恐吓”一下虚拟机,也能顺利拿到堆转储快照。
jmap 命令格式:
jmap [ option ] vmid
jmap 工具主要选项:
-dump: 使用hprof二进制形式,输出jvm的heap内容到文件,生成 Java 堆转储快照。格式为 -dum:[live,]format=b,file=filename, 其中 live 子参数说明是否只 dump 存活的对象。
-finalizeinfo: 显示在F-Queue 中等待Finalizer 线程执行 finalize 方法的对象。只在 Linux/Solaris 平台有效。
-heap: 显示 Java 堆详细信息,如使用哪种回收器、参数配置、分代状况等。只在 Linux/Solaris 平台有效。
-histo: 显示堆中对象统计信息,包括类、实例数量、合计容量。
-permstat: 以 ClassLoader 为统计口径显示永久代内存状态。只在 Linux/Solaris 平台有效。
-F: 当虚拟机进程对 -dump 选项没有响应时,可使用这个选项强制生成 dump 快照。只在 Linux/Solaris 平台有效。
列出实例对象最多的200个类:
jmap -histo:live pid | head -200
jmap -dump:live,format=b,file=testjmapname.dump pid
jmap -histo:live pid 在***:live***前会进行full gc,带上live则只统计活对象,因此不加live的堆大小要大于加live堆的大小
线上系统,内存特别大,jmap执行期间会对进程产生很大影响,甚至卡顿,线上慎用(电商不适合用)
六、jhat 虚拟机堆转储快照分析工具
JDK 提供 jhat ( JVM Heap Analysis Tool) 命令与 jmap 搭配使用,来分析 jmap 生成的堆转储快照。jhat 内置一个微型的 HTTP/Web 服务器,生成堆转储快照的分析结果后,可以在浏览器中查看,包括对象的数量,大小等等,并支持对象查询语言。Jhat 分析工具简漏,一般不用。
jhat testjmapname.dump
当屏幕显示"Server is ready." 的提示后,在浏览器中输入http://localhost:7000/ 可以看到分析结果。
使用MAT /jvisualvm 也可以进行dump文件分析。
七、jstack Java 堆栈跟踪工具
jstask ( Stack Trace for Java ) 命令用于生成虚拟机当前时刻的线程快照。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成快照的目的通常是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间挂起等。
jstack 命令格式:
jstack [ option ] vmid
jstack 工具主要选项:
-F: 当正常输出的请求不被响应时,强制输出线程堆栈。
-l: 除堆栈外,显示关于锁的附加信息
-m: 如果遇到本地方法的话,可以显示 C/C++ 的堆栈
top + jsatck 找出的当前耗cpu的线程
-
top 观查进行,找出最耗cpu的进程
$ top
-
top -Hp PID 观查进程中的线程信息,并找出最耗cpu的线程(假设上一步找出的PID是123456)
$ top -Hp 123456
-
将线程号转换为16进制
-
jstack PID | grep 转换为16进制的线程号(假设找出的线程号转换为16进制后为ab1234)
$ jstack 123456 | grep ab1234
-
最后得出来的信息即当前最繁忙的线程信息
八、Arthas在线排查工具
为什么需要在线排查?
在生产上我们经常会碰到一些不好排查的问题,例如线程安全问题,用最简单的threaddump或者heapdump不好查到问题原因。为了排查这些问题,有时我们会临时加一些日志,比如在一些关键的函数里打印出入参,然后重新打包发布,如果打了日志还是没找到问题,继续加日志,重新打包发布。对于上线流程复杂而且审核比较严的公司,从改代码到上线需要层层的流转,会大大影响问题排查的进度。
- 观察jvm信息
- thread定位线程问题
- dashboard 观察系统情况
- heapdump + jhat分析
- jad反编译
动态代理生成类的问题定位
第三方的类(观察代码)
版本问题(确定自己最新提交的版本是不是被使用) - redefine 热替换
目前有些限制条件:只能改方法实现(方法已经运行完成),不能改方法名, 不能改属性 - sc - search class
- watch - watch method
- …
arthas文档:https://alibaba.github.io/arthas/