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

使用 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
分析:

- 第一行是我们关心的 Java 进程,从
/usr/bin/java开始,后面的所有内容都是 JVM 启动参数和主程序信息。 -Xms512m,-Xmx1024m,-XX:MaxMetaspaceSize=256m这些就是我们通常在Java_OPTS中设置的参数。my-application.jar是主程序。
更友好的输出(推荐):
使用 ps 的 ww 参数可以防止长命令被截断,并使用 grep -v 过滤掉 grep 进程本身。
ps -ef | grep -v grep | grep java
或者使用 ps 的 l 参数(长格式),这样能看到更完整的一行:
ps -l -C java
使用 jps 和 jcmd 命令(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。
