在长期排查线上问题的过程中,总结了一些工具的使用方法以及排查思路。 在这里我想和大家分享一下。 当遇到类似问题的时候,希望能够给予一些帮助。
我们先谈谈工具。 jvm自带的一些工具是必须掌握的,比如jmap、jstat等,它们可以帮助我们了解JVM在做什么。 主要应用领域如下:
1、
它可以告诉你所有JVM线程当前正在做什么,包括用户线程和虚拟机线程。 可以用它查看线程堆栈,结合Lock信息来检测是否发生了死锁和死锁线程。
知道你的小朋友在做什么是可以的。
另外,当你使用top -H查看占用CPU很高的pid时,可以将其转换为十六进制,然后在转储的文件中搜索,看看是什么线程占用了CPU。
2. jstat
stat,顾名思义,提供一些统计信息。 它可以告诉你当前GC的情况,包括GC次数和时间。 具体GC还可以结合gc.log文件进行分析。
一般来说,我们通过jstat查看GC情况来判断是否有频繁的YGC或者FGC,然后查看gc.log和jam dump内存,以及MAT分析来定位问题(后面会有这种场景的案例)。
常见用法是jstat - pid
3.jmap
不可避免地会被用来解决GC问题的工具。 jmap可以告诉你当前JVM内存堆中对象的分布和关系。 转储堆后,可以使用 MAT 对其进行分析,看看其中有哪些大对象,或者哪些类的实例特别多。
常见用法:
强制 FGC:-histo:live
转储堆:-dump:[live],=b,file=dump.bin
查看每一代的内存使用情况:-heap
然后我们介绍一些开源工具来增强JVM工具本身的作用。
4. 顶部
这是linux的内置命令。 要查看系统资源的消耗情况,可以查看CPU、内存、SWAP、I/O的消耗情况。 有几个值需要特别注意:
ni,如果这个值特别高,说明线程上下文切换的开销很大,看看是不是线程太多导致的
res,这个代表进程实际占用的内存
swap,内存不足会占用swap空间。 这时一般应用的性能会急剧下降,所以要特别注意