如何在Linux上使用Java命令排查CPU和内存问题

        在生产环境中,排查 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  <时间间隔> <次数>

是 Java 进程的 PID,<时间间隔> 是取样时间间隔(以毫秒为单位),<次数> 是取样次数。

用这个命令可以看到进程是否频繁触发FGC和GC耗时,再通过jvm参数对程序进行调优

jmap 命令

jmap 命令用于生成 Java 进程的内存转储快照,可用于分析堆内存占用情况:

jmap -heap 

这条命令将显示 Java 进程的堆内存使用情况,能够看到Eden区,新生代和老年代的内存使用情况。

 jcmd 命令

jcmd 命令可用于执行多种诊断命令,包括查看堆转储、GC 统计、线程栈等:

# 列出指定 Java 进程的可用诊断命令
jcmd  help
# 显示 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 应用程序的性能问