这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战
命令工具
jps
查看操作系统运行的java进程
第一个数字表示进程运行的pid
jstack
查看java进程中的线程堆栈,执行命令jstack 1 |less
jstack可以查看线程堆栈、线程状态。通常用来排查这两个bug:
- java进程CPU过高: 当CPU过高时我们需要知道哪个线程在执行什么导致CPU过高
- Java线程死锁: jstack可以查看线程的状态以及等待的锁信息,死锁的产生通常是由于代码引起的
jmap
用法: jmap option pid
option选项值有:
| 选项 | 含义 |
|---|---|
-dump | 生成java堆转储文件,用法 jmap -dump:[live,]format=b,file=<filename>,带上live参数表名会立即进行一次full gc,如此一来文件里面都是存活的对象。使用案例 |
-finalizerinfo | 查看在F-Queue中等待Finalizer线程执行finalize方法的对象。只在Linux、solaris平台有效 |
-heap | 查看java堆的信息,如使用的垃圾回收器、垃圾回收参数配置、新生代老年代信息大小多少 |
-histo | 查看堆中对象的统计信息,如类、实例数量、合计容量 |
-F | 当虚拟机进程对-dump选项没有响应时,可以使用该选项强制生成dump快照 |
使用例子:
jmap -histo 1
通常业务系统都是char、map类型占用多
jmap -dump:live,format=b,file=jmapDump 1
注意live会进行一次full gc
jstat
查看java进程gc情况,如次数,耗时信息
用法: jstat option pid [interval(s|ms) [count]]
interval表示间隔几秒刷新一次,count表示刷新多少次
option选项
比如查看gc情况
jstat -gc 1 50ms 5
可以看到FGC次数不为0,因为刚刚执行了jmap -dump命令
图形化工具
图形化工具有 JConsole、visualVM、jprofile。下面试用下visualVMware。
可视化监控
JVM监控能够更方便我们定位问题排查问题。常用到的监控指标有:
- 机器CPU
- 机器内存
- 机器网络IO
- 机器磁盘IO
- JVM堆空间(old,eden,s1/s2,code cache,metaspace,class compressed class space)
- 类加载数量
- 线程数
- gc数和gc耗时
可以看到上面不仅仅有jvm监控指标还有机器指标,机器指标可以帮助排查对外的问题。