直接调用 system.getproperties() 并遍历打印可获取 jvm 启动时加载的所有系统属性(如 java.version、os.name、user.dir 等),用于排查环境差异、路径错误或编码问题;推荐用 entryset() 排序后遍历,避免 list() 截断风险。

直接调用 System.getProperties() 并遍历打印,就能看到当前 JVM 启动时加载的所有系统属性(包括 Java 版本、操作系统、类路径、编码、用户目录等),这对排查环境差异、路径错误、编码问题或启动参数缺失非常有用。
获取并打印所有系统属性
最常用方式是用 Properties 的 list() 方法或手动遍历 keySet():
- 推荐用
entrySet()遍历,输出清晰且可控制格式:
Properties props = System.getProperties();
props.entrySet().stream()
.sorted(Map.Entry.comparingByKey())
.forEach(e -> System.out.println(e.getKey() + " = " + e.getValue()));
- 如果只是快速查看,
props.list(System.out)更简洁,但输出格式固定(带缩进和序号,不易 grep) - 注意:
list()默认只输出前 100 行,超长会被截断;遍历entrySet()无此限制
重点关注的调试关键属性
不是所有属性都相关,以下几项在调试中最常被检查:
- java.version / java.home:确认实际运行的 JDK 版本和安装路径,避免 IDE 和命令行用的 JDK 不一致
- os.name / os.arch / os.version:验证目标平台是否匹配(如误在 Linux 启动 Windows 专用逻辑)
- user.dir / user.home:定位相对路径解析起点,解决“找不到配置文件”或“写入失败”问题
- file.encoding / sun.jnu.encoding:排查中文乱码、日志乱码、读取资源文件失败
- java.class.path:检查 jar 包是否真的被加载,是否存在重复或缺失依赖
- java.awt.headless:图形界面相关异常(如 HeadlessException)的根源
结合启动参数一起看更有效
系统属性部分来自 JVM 启动参数(如 -Dfile.encoding=UTF-8),部分由 JVM 自动设置。建议同时打印 JVM 参数辅助分析:
- 用
ManagementFactory.getRuntimeMXBean().getInputArguments()获取启动时传入的 VM 参数 - 对比发现:某个
-Dxxx没生效?可能是拼写错误(如file.encoding写成file.encodeing),或被后续代码覆盖 - 注意:
System.setProperty()修改的是运行时副本,不影响原始启动值;而System.getProperties()返回的是当前生效值
生产环境慎用 & 替代方案
全量打印可能泄露敏感信息(如 user.name、路径结构、内网 IP 等),线上应避免:
- 调试阶段可在本地或测试环境完整输出
- 生产环境建议按需查询特定 key:
System.getProperty("java.version") - 日志中记录关键属性即可,例如启动时打一行:
INFO - JVM: {} on {}, encoding: {}对应java.version、os.name、file.encoding - 也可用 JMX 或
jinfo -sysprops <pid></pid>在不改代码情况下动态查看
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











