JVM调优
性能监测的命令行工具
操作系统层面:top、vmstat、iostat、netstat 等命令,可以监控系统整体的资源使用情况,比如说内存、CPU、IO 使用情况、网络使用情况。
JDK 自带的命令行工具层面,jps、jstat、jinfo、jmap、jhat、jstack、jcmd 等,可以查看 JVM 运行时信息、内存使用情况、堆栈信息等。
jmap 使用
使用 jmap -heap <pid> 查看堆内存摘要,包括新生代、老年代、元空间等。
使用 jmap -histo <pid> 查看对象分布。
生成堆转储文件:jmap -dump:format=b file=<path><pid>。
可视化的性能监控工具
JConsole:JDK 自带的监控工具,可以用来监视 Java 应用程序的运行状态,包括内存使用、线程状态、类加载、GC 等。
VisualVM:一个基于 NetBeans 的可视化工具,在很长一段时间内,VisualVM 都是 Oracle 官方主推的故障处理工具。集成了多个 JDK 命令行工
具的功能,非常友好。
Java Mission Control:JMC 最初是 JRockit VM 中的诊断工具,但在Oracle JDK7 Update 40 以后,就绑定到了 HotSpot VM 中。不过后来又被
Oracle 开源出来作为了一个单独的产品。
arthas:阿里巴巴开源的 Java 诊断工具,主要用于线上的应用诊断;支持在不停机的情况下进行诊断;可以提供包括JVM信息查看、监控、Trace 命令、反编译等功能。
CPU 高占用排查?
首先,使用 top 命令查看 CPU 占用情况,找到占用 CPU 较高的进程 ID。
接着,使用 jstack 命令查看对应进程的线程堆栈信息。jstack -l <pid> > thread-dump.txt
这个命令会将所有线程的堆栈信息输出到 thread-dump.txt 文件中。
然后再使用 top 命令查看进程中线程的占用情况,找到占用 CPU 较高的线程 ID。top -H -p <pid>
接着在 jstack 的输出中搜索这个十六进制的线程 ID,找到对应的堆栈信息。
内存飙高问题排查?
内存飚高一般是因为创建了大量的 Java 对象导致的,如果持续飙高则说明垃圾回收跟不上对象创建的速度,或者内存泄漏导致对象无法回收。
第一,先观察垃圾回收的情况,可以通过 jstat -gc PID 1000 查看GC 次数和时间。
或者使用 jmap -histo PID | head -20 查看堆内存占用空间最大的前 20 个对象类型。
第二步,通过 jmap 命令 dump 出堆内存信息。
第三步,使用可视化工具分析 dump 文件,比如说 VisualVM,找到占用内存高的对象,再找到创建该对象的业务代码位置,从代码和业务场景中定
位具体问题。