RuntimeMXBean.getInputArguments() 返回JVM显式启动参数(如-Xmx、-D),不含main方法args、环境变量或默认参数;系统属性用System.getProperty(),环境变量用System.getenv()。

ManagementFactory.getRuntimeMXBean() 返回的是 JVM 运行时的管理接口实例(RuntimeMXBean),它**不直接提供“启动变量参数”**,但能获取 JVM 启动时传入的 **JVM 参数(即 VM arguments)**,比如 -Xmx、-XX:+UseG1GC、-Dfile.encoding=UTF-8 等。注意:它**不包含程序主方法的命令行参数(args)**,也不包含环境变量或系统属性的全部内容(尽管部分 -Dkey=value 会同时影响系统属性)。
如何获取 JVM 启动参数
通过 RuntimeMXBean.getInputArguments() 方法可获得一个 List<string></string>,里面是 JVM 启动时显式指定的参数(不含主类名和应用参数):
- 返回结果示例:
[-Xms512m, -Xmx2g, -XX:+UseZGC, -Dapp.name=myapp] - 该列表不包含默认参数(如未显式设置的
-server或 JVM 自动添加的调试参数),只含用户/脚本明确传入的参数 - 参数顺序与启动命令中的一致,可用于审计或运行时策略判断(例如检查是否启用了 JFR)
区分 JVM 参数与应用参数
Java 程序启动命令形如:java -Xmx1g -Dlog.level=debug MyApp arg1 arg2
-
RuntimeMXBean.getInputArguments()只返回[-Xmx1g, -Dlog.level=debug] -
arg1和arg2是main(String[] args)中的参数,需在入口方法中直接使用,无法通过 MXBean 获取 - 若需统一管理启动配置,建议将应用参数也解析为键值对(如用
commons-cli),或约定以-D形式传入(此时会被getInputArguments()捕获,并自动加载为系统属性)
获取系统属性和环境变量的正确方式
虽然 RuntimeMXBean 不提供环境变量,但可通过标准 API 补充关键配置:
- 系统属性(包括
-D参数):System.getProperty("key")或System.getProperties() - 环境变量:
System.getenv("PATH")或System.getenv() - 注意:
-Dkey=value会被自动注入系统属性,所以System.getProperty("key")能取到,但getInputArguments()里仍保留原始-Dkey=value字符串
实用代码片段
快速打印 JVM 启动参数和关键系统属性:
RuntimeMXBean mxBean = ManagementFactory.getRuntimeMXBean();
System.out.println("JVM Args: " + mxBean.getInputArguments());
System.out.println("PID: " + mxBean.getPid()); // Java 9+
System.out.println("Uptime: " + mxBean.getUptime() + " ms");
System.out.println("Java Home: " + System.getProperty("java.home"));
System.out.println("User Dir: " + System.getProperty("user.dir"));
该方式轻量、无需额外依赖,适合监控、诊断或启动检查逻辑。

















