| 維度 | System.getenv() | System.getProperties() |
|---|---|---|
| 數據來源 | 操作系統級環境變量 | JVM 系統屬性 |
| 作用範圍 | 進程外部,全局可見 | JVM 進程內部 |
| 設置方式 | OS 環境變量設置 (Windows 環境變量、Linux export) | 啟動參數 -Dkey=value 或代碼 System.setProperty() |
| 典型用途 | 跨進程配置、容器化部署注入 | JVM 調優、應用內部配置、版本信息 |
PATH、JAVA_HOME、USERgetenv() 返回不可修改的 Map<String, String>getenv(String name) 獲取指定變量,不存在返回 nullJDK 文檔定義的標準系統屬性包括:

java.version、java.home、os.name、user.dir 等java -Dapp.config=prod -Ddb.url=jdbc:mysql://... MainClassSystem.setProperty("key", "value")| 場景 | 推薦方案 |
|---|---|
| Docker/K8s 環境注入配置 | 環境變量 (getenv) |
| JVM 參數調優 (Heap、GC) | 系統屬性 (-D) |
| 應用業務配置 (數據庫、第三方密鑰) | 環境變量 (十二因子應用規範) |
| 單元測試臨時覆蓋配置 | 系統屬性 (System.setProperty) |
public class EnvVsProps {
public static void main(String[] args) {
// 環境變量
String javaHome = System.getenv("JAVA_HOME");
System.out.println("JAVA_HOME = " + javaHome);
// 系統屬性
String appMode = System.getProperty("app.mode", "dev"); // 默認值
System.out.println("app.mode = " + appMode);
// 遍歷所有系統屬性
System.getProperties().forEach((k, v) ->
System.out.println(k + " = " + v));
}
}
System.getenv() 讀取 OS 環境變量,屬於部署層配置;System.getProperties() 讀取 JVM 系統屬性,屬於運行時配置。 現代雲原生應用推薦使用環境變量管理配置,系統屬性專注 JVM 行為控制。