在生产环境中,排查 Java 应用程序的 CPU 和内存问题至关重要。在 Linux 系统上,有许多命令可用于监视和分析 Java 进程的性能。下面将介绍如何使用这些命令来识别和解决潜在的性能瓶颈问题。
1. 监视 CPU 使用情况
top 命令
使用 top 命令可以实时监视系统的 CPU 使用情况。以下是如何查看 CPU 使用情况:
top -c -p
这条命令将显示 Java 进程的 CPU 使用情况以及相关信息。-c 选项可以显示完整的命令行参数,-p 选项后跟随 Java 进程的 PID。
ps 命令
使用 ps 命令可以显示 Java 进程的详细信息,包括 CPU 使用百分比:
ps aux | grep java
这条命令显示 Java 进程的 PID、CPU 使用率等信息。
jps 命令
jps命令可以看到正在运行的所有java程序
2. 分析内存使用情况
jstat 命令
jstat 命令用于监视 Java 虚拟机的统计信息,包括堆内存和垃圾回收信息:
jstat -gc<时间间隔> <次数>
用这个命令可以看到进程是否频繁触发FGC和GC耗时,再通过jvm参数对程序进行调优
jmap 命令
jmap 命令用于生成 Java 进程的内存转储快照,可用于分析堆内存占用情况:
jmap -heap
这条命令将显示 Java 进程的堆内存使用情况,能够看到Eden区,新生代和老年代的内存使用情况。
jcmd 命令
jcmd 命令可用于执行多种诊断命令,包括查看堆转储、GC 统计、线程栈等:
# 列出指定 Java 进程的可用诊断命令 jcmdhelp # 显示 Java 进程的所有详细信息,包括系统属性、JVM 参数等 jcmd VM.system_properties # 显示 Java 进程的运行时参数(命令行参数) jcmd VM.command_line # 显示 Java 进程的所有线程栈跟踪 jcmd Thread.print # 打印 Java 进程的堆转储 jcmd GC.heap_dump filename= # 查看 Java 进程的 GC 统计信息 jcmd GC.class_histogram
这些命令可以显示 Java 进程的虚拟机标志和堆信息。
3. 使用 VisualVM 进行进一步分析
VisualVM 是一个功能强大的图形化工具,可以用于监视、分析和调优 Java 应用程序。可以在 Linux 上安装 VisualVM 并连接到远程 Java 进程。
安装 VisualVM
确保系统已安装 Java Development Kit(JDK)linux要支持图形化界面才能用!!!,然后下载 VisualVM 并解压:
# 下载 可能会比较慢,可以在本地下载完上传到linux服务器上去 wget https://github.com/oracle/visualvm/releases/download/2.1.7/visualvm_217.zip # 解压 unzip visualvm_2.1.7.zip
下载地址:VisualVM: Download
解压完进入 VisualVM 目录并运行 visualvm:
cd visualvm_2.1.7/bin ./visualvm
连接到远程 Java 进程并利用 VisualVM 的各种功能进行进一步的性能分析和调优。
配置远程 Java 进程
在启动远程 Java 进程时,添加如下 JVM 参数以启用 JMX 监听,PORT_NUMBER 是远程 JMX 连接的端口号。确保这个端口没有被防火墙阻止并可以在网络上访问。:
-Dcom.sun.management.jmxremote.port=8777 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
在启动脚本添加JMX参数之后,重启java应用,执行命令查看jmx端口是否正常监听
netstat -ntlp|grep 8777
查看VIsualVM
刚才上面提到了VisualVM需要在Linux图形化界面才能使用,或这在windows上也可以远程连接。
windows上使用VisualVM(我这里用的是JDK1.8),到JAVA_HOME下bin目录找到jvisualvm.exe,
双击运行
4. 结语
以上是在 Linux 上使用命令行排查 Java 应用程序 CPU 和内存问题的方法。这些命令提供了对 Java 进程进行基本的性能监视和诊断的手段,同时 VisualVM 则提供了更多功能和图形化界面,方便进行更深入的分析和调优。
希望这些命令和工具能够帮助小伙伴们快速定位和解决 Java 应用程序的性能问