JVM 系列文章传送门
JVM 性能调优 -- 线上应用 JVM 内存的的预估设置【实战】
JVM 性能调优 -- 模拟触发 Minor GC【GC 日志分析】
JVM 性能调优 -- 模拟触发 Minor GC(2)【GC 日志分析】
JVM 性能调优 -- CMS 垃圾回收器 GC 日志分析【Full GC】
JVM 性能调优 -- JVM常用调优工具【jps、jstack、jmap、jstats 命令】
案例
我们在 Linux 服务器上运行 JVM 相关指令,查看 JVM 运行情况的时候,发现 jps、jstack、jmap、jstats 无法执行,报错如下:
powershell
bash: jstack: command not found
错误的意思很明显是说没有找到 jstack 命令,但我们知道这些没命令是 JDK 自带的,怎么会没有这些命令呢?
问题原因
- 需要到 JDK 的 bin 目录下执行。
- 没有配置环境变量。
去 JDK bin 目录下执行
查找 JDK 安装目录,执行命令如下:
powershell
whereis is java
执行结果如下:
powershell
is:java: /data/svr/jdk1.8.0_251/bin/java
找到 JDK 安装目录后,我们去 JDK bin 目录再次执行 jstack 命令,执行结果如下:
powershell
bash: jstack: command not found
还是没有找到该命令,因此大概率是没有配置环境变量。
配置环境变量
找到 /etc/profile 文件,执行如下命令:
powershell
vim /etc/profile
在 profile 文件末尾添加如下配置:
powershell
export JAVA_HOME=/data/svr/jdk1.8.0_251
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
执行 :wq! 保存退出。
执行如下命令刷新配置:
powershell
source /etc/profile
每次切换用户后都需要执行上述命令,没搞懂是为什么,欢迎各位朋友解惑。
再次来到 bin 目录下执行 jstack 命令如下:
powershell
Usage:
jstack [-l] <pid>
(to connect to running process)
jstack -F [-m] [-l] <pid>
(to connect to a hung process)
jstack [-m] [-l] <executable> <core>
(to connect to a core file)
jstack [-m] [-l] [server_id@]<remote server IP or hostname>
(to connect to a remote debug server)
Options:
-F to force a thread dump. Use when jstack <pid> does not respond (process is hung)
-m to print both java and native frames (mixed mode)
-l long listing. Prints additional information about locks
-h or -help to print this help message
显然 jstack 命令生效了。
总结:本篇简单分享了 Linux 环境 jps、jstack、jmap、jstats 命令不生效的处理方式,希望可以帮助到有需要的小伙伴。