杰瑞科技汇

linux 查看java opts

Java_OPTS 本身不是一个环境变量,它通常是一个 约定俗成的变量名,用于在启动脚本(如 catalina.sh for Tomcat)中预先定义好 JVM 参数,然后在启动 Java 进程时引用它,查看它的核心是找到 正在运行的 Java 进程,然后查看它的启动命令。

linux 查看java opts-图1
(图片来源网络,侵删)

使用 ps 命令(最常用、最直接)

这是最直接的方法,可以直接看到 Java 进程启动时使用的完整命令行参数,其中就包含了 Java_OPTS 的内容。

基本用法:

ps -ef | grep java
  • ps -ef:显示所有进程的详细信息。
  • grep java:过滤出包含 "java" 关键字的行。

示例输出:

# ps -ef | grep java
tomcat   12345  1234  5 10:30 pts/0    00:15:30 /usr/bin/java -Xms512m -Xmx1024m -XX:MaxMetaspaceSize=256m -Djava.awt.headless=true -jar my-application.jar
root     23456  2345  0 11:00 pts/1    00:00:00 grep --color=auto java

分析:

linux 查看java opts-图2
(图片来源网络,侵删)
  • 第一行是我们关心的 Java 进程,从 /usr/bin/java 开始,后面的所有内容都是 JVM 启动参数和主程序信息。
  • -Xms512m, -Xmx1024m, -XX:MaxMetaspaceSize=256m 这些就是我们通常在 Java_OPTS 中设置的参数。
  • my-application.jar 是主程序。

更友好的输出(推荐):

使用 psww 参数可以防止长命令被截断,并使用 grep -v 过滤掉 grep 进程本身。

ps -ef | grep -v grep | grep java

或者使用 psl 参数(长格式),这样能看到更完整的一行:

ps -l -C java

使用 jpsjcmd 命令(JDK 自带工具)

如果你的系统安装了 JDK,可以使用这些更专业的 Java 工具。

使用 jps 查找 Java 进程 ID (PID)

jps -l

示例输出:

# jps -l
12345 /path/to/my-application.jar
23456 sun.tools.jps.Jps

这里的 12345 就是我们 Java 应用的进程 ID。

使用 jcmd 打印命令行参数

jcmd 是一个非常强大的工具,可以用来向 JVM 发送各种诊断命令。

# <pid> VM.flags 显示JVM标志(即启动参数)
jcmd <pid> VM.flags
# 或者直接显示完整的命令行
jcmd <pid> VM.command_line

示例:

# 假设PID是12345
jcmd 12345 VM.flags

示例输出:

# jcmd 12345 VM.flags
-XX:MaxMetaspaceSize=268435456 -Xms536870912 -Xmx1073741824 ...

这会以 -D-X 的形式列出所有 JVM 标志,这些就是 Java_OPTS 的最终体现。


查看启动脚本(如果可以访问)

如果你知道应用是由哪个脚本启动的,直接查看脚本文件是最根本的方法。

查找启动脚本

对于常见的应用,脚本通常在安装目录的 bin 目录下。

  • Tomcat: CATALINA_HOME/bin/catalina.sh
  • Spring Boot: java -jar 通常在某个 start.sh 或直接在命令行中。
  • 其他应用: 查看应用文档或部署目录。

查看脚本内容

# 查看Tomcat的启动脚本
grep "JAVA_OPTS" /path/to/tomcat/bin/catalina.sh

示例 catalina.sh 内容片段:

# 在脚本开头,通常会定义默认的JAVA_OPTS
export JAVA_OPTS="-Xms512m -Xmx1024m"
# 在启动命令中,会引用这个变量
"$_RUNJAVA" $JAVA_OPTS ...

通过这种方式,你可以看到原始的 Java_OPTS 定义,但要注意,脚本启动时可能会动态修改这个变量(通过 export JAVA_OPTS="$JAVA_OPTS -Dnew.param")。


查看 /proc 文件系统(Linux 特有)

在 Linux 中,一切皆文件,正在运行的进程信息也存储在 /proc 目录下。

找到 Java 进程的 PID

ps -ef | grep java | grep -v grep | awk '{print $2}'

假设得到 PID 是 12345

查看 /proc/<pid>/cmdline

这个文件包含了进程启动时的完整命令行,参数之间用 \x00 (空字符) 分隔。

cat /proc/12345/cmdline | tr '\0' ' '

示例输出:

/usr/bin/java -Xms512m -Xmx1024m -XX:MaxMetaspaceSize=256m -Djava.awt.headless=true -jar my-application.jar

查看 /proc/<pid>/environ

这个文件包含了进程启动时的所有环境变量,包括 JAVA_OPTS(如果它被继承了下来),变量之间也是用 \x00 分隔。

# 查看所有环境变量
cat /proc/12345/environ | tr '\0' '\n'
# 只查看JAVA_OPTS
cat /proc/12345/environ | tr '\0' '\n' | grep JAVA_OPTS

注意: 这种方法只能看到启动脚本 导出 到环境中的 JAVA_OPTS,如果某个脚本只是在自己的局部变量中使用 JAVA_OPTS 而没有 export,那么这里就看不到。


总结与推荐

方法 优点 缺点 适用场景
ps -ef \| grep java 最简单、最直接、最常用,能直接看到所有参数。 长命令可能被截断。 日常运维、快速检查,首选方法。
jcmd <pid> VM.flags 信息最准确、最专业,是JDK官方工具,格式清晰。 需要安装JDK,需要先找到PID。 JDK环境下的深入分析、故障排查。
查看启动脚本 最根本,能看到原始配置和逻辑。 需要找到并访问脚本文件,无法看到运行时修改。 开发、调试,理解应用启动配置。
/proc/<pid>/... Linux系统原生,无需额外工具。 /proc/cmdline 格式特殊,/proc/environ 可能不包含未export的变量。 深入理解Linux进程模型,应急排查。

对于绝大多数情况,使用 ps -ef | grep java 是最快、最有效的方法。 如果需要更详细的JVM信息,再使用 jcmd

分享:
扫描分享到社交APP
上一篇
下一篇