在进行JVM调试时,熟练使用Linux和Java命令是非常重要的,有利于我们快速发现问题,并进行解决。平时常用的命令有:Linux的Top、Top -Hp等;Java的Jps、Jinfo、Jstack、Jstat、Jmap、Jhat等。下面,我将逐一介绍一下:
1. Linux Top命令 -> 查询高内存/高CPU进程号(pid):
- 作用:选择占用内存 或 CUP占用率 高的进程号(pid)。
- 相关快捷键:
- 按住 shift + M 可按内存大小排序
- 按住 shift + P 可按CPU占用率大小排序
2. Linux Top -Hp -> 查看某进程下所有线程:
- 命令解释:
- -H:进入线程模式
- -p:指定pid
- pid:进程号
3. Jps命令 -> 查找正在运行的java进程:
其他作用:Jps -v -> 查看JVM启动时,显式指定的参数信息:
4. Jinfo命令 -> 查询JVM各项配置信息:
jinfo -flag :
- -flag :查询具体JVM参数。例如 -flag MaxMetaspaceSize
- pid 进程id
jinfo :
拓展:它还可以调整JVM配置信息。
5. Jstack命令 -> 查看Java线程堆栈信息:
jstack > /xx/xx/stack.log:生成JVM当前时刻的线程快照,打印Java线程堆栈信息。
jstack -m -> 检查是否有死锁:
主要解决线程间死锁、死循环、请求外部资源导致的长时间等待等问题:
- 重点关注:WAITING状态、 BLOCKED状态
- 关注:waiting on (a java.lang.Object)
- 假如有一个进程中100个线程,很多线程都在waiting on ,一定要找到是哪个线程持有这把锁,怎么找?搜索jstack dump的信息,找 ,看哪个线程持有这把锁,它是一般状态是RUNNABLE。
- 为什么阿里规范里规定,线程的名称(尤其是线程池)都要写有意义的名称
- 怎么样自定义线程池里的线程名称?(自定义ThreadFactory)
6. Jstat命令 ->监控Java应用程序的资源和性能:
jstat -options :
- -class (类加载器) -compiler (JIT) -gc (GC堆状态)
- -gccapacity (各区大小) -gccause (最近一次GC统计和原因)
- -gcnew (新区统计) -gcnewcapacity (新区大小)
- -gcold (老区统计) -gcoldcapacity (老区大小)
- -gcpermcapacity (永久区大小) -gcutil (GC统计汇总)
- -printcompilation (HotSpot编译统计)
jstat -gc 500 -> 动态观察GC情况,发现频繁GC:
- jstat -gc 500 : 每个500个毫秒打印GC的情况
7. Jmap命令:
用法一:下载dump文件:
jmap -dump:format=b,file=D:/test/filename.hprof
jmap -dump:format=b,file=/data/dump.hprof 21210
- 线上系统,内存特别大,jmap执行期间会对进程产生很大影响,甚至卡顿,所以电商不适合。
- 解决1:设定了参数HeapDump,OOM的时候会自动产生堆转储文件
- 解决2:很多服务器备份(高可用),停掉这台服务器对其他服务器不影响
- 解决3:在线定位(一般小点儿公司用不到)
用法二:打印每个class的实例数目,内存占用,类全名信息:
jmap -histo | head -n 20
Tips:VM的内部类名字开头会加上前缀"*" ;如果使用-histo:live,只统计活的对象数量。
8. Jhat命令 -> 分析dump文件,生成可视化页面:
jhat -J-Xmx30g filename.hprof
jhat -J-Xmx1g -port 442 /data/dump.hprof
9. 查看JVM参数:
9.1 查看已经被用户或者JVM设置过的所有参数命令:
java -XX:+PrintCommandLineFlags -version
9.2 查看JVM 所有参数命令 -> 主要查看修改更新:
java -XX:+PrintFlagsFinal -version
= 等号 是JVM默认加载的参数,有冒号:= 表示人为修改之后的参数
9.3 查看JVM 所有参数命令->查看JVM初始化默认值:
java -XX:+PrintFlagsInitial -version
9.4 查看某一java进程的JVM 配置:
jinfo -flags PID
9.5 查看某个进程JVM的某一参数命令:
jinfo -flag UseG1GC PID