Java 命令行參數詳解:系統屬性、JVM 選項與應用配置

Java 命令行參數詳解:系統屬性、JVM 選項與應用配置

在 Java 應用啟動命令中,如:

java -jar -Dserver.port=8088 xdr-demo-1.0-SNAPSHOT-assembly.jar &

-Dserver.port=8088是一個 系統屬性(System Property) 設置。類似的參數都屬于 Java 命令行選項,主要分為以下幾類:

一、核心參數類型

  1. 標準選項 (-)

    • 格式: -選項名[=值]
    • 作用: 所有符合規范的 JVM 實現都必須支持的選項。
    • 關鍵示例:
      • -D<name>=<value> (系統屬性): 最常用、最靈活的應用配置方式。
        • -Dserver.port=8088 (設置應用端口)
        • -Dspring.profiles.active=prod (設置 Spring Boot 環境)
        • -Dlog4j.configurationFile=/path/to/log4j2.xml (設置 Log4j2 配置文件)
        • -Djava.net.preferIPv4Stack=true (優先使用 IPv4)
        • -Duser.timezone=GMT+08:00 (設置 JVM 默認時區)
      • -classpath-cp: 設置類路徑。
        • -cp lib/*:conf/ com.example.Main
      • -jar <filename>: 執行可運行的 JAR 文件。
      • -version: 顯示版本信息。
      • -showversion: 顯示版本信息并繼續執行。
      • -? / -help: 顯示標準選項幫助。
  2. 非標準選項 (-X)

    • 格式: -X選項名[=值]
    • 作用: 特定于 HotSpot JVM 的通用選項(其他 JVM 實現可能不支持或含義不同)。
    • 關鍵示例:
      • -Xms<size>: 設置 初始 堆大小。
        • -Xms512m (初始堆 512MB)
      • -Xmx<size>: 設置 最大 堆大小。
        • -Xmx2048m (最大堆 2048MB/2GB)
      • -Xss<size>: 設置 線程棧 大小。
        • -Xss256k (每個線程棧 256KB)
      • -Xmn<size>: 設置 年輕代 (Young Generation) 大小(通常建議讓 JVM 自動調整)。
      • -XshowSettings: 顯示所有設置(系統屬性、區域設置等)。
      • -Xloggc:<file>: 將 GC 日志輸出到文件。
        • -Xloggc:/logs/gc.log
      • -X: 顯示非標準選項 (-X) 的幫助信息。
  3. 高級運行時選項 (-XX:)

    • 格式: -XX:+<option> (啟用), -XX:-<option> (禁用), -XX:<option>=<value> (設置值)
    • 作用: 用于 JVM 調優、診斷、低級別控制的“旋鈕”。這些選項不穩定(不同 JVM 版本可能變更或移除),需謹慎使用。
    • 關鍵示例:
      • 內存與 GC 調優:
        • -XX:+UseG1GC (啟用 G1 垃圾收集器)
        • -XX:MaxGCPauseMillis=200 (設置 GC 最大停頓時間目標)
        • -XX:NewRatio=2 (老年代:年輕代 = 2:1)
        • -XX:SurvivorRatio=8 (Eden:Survivor = 8:1)
        • -XX:MetaspaceSize=256m (元空間初始大小)
        • -XX:MaxMetaspaceSize=512m (元空間最大大小)
        • -XX:+HeapDumpOnOutOfMemoryError (OOM 時生成堆轉儲)
        • -XX:HeapDumpPath=/path/to/dumps (指定堆轉儲路徑)
      • 調試/診斷:
        • -XX:+PrintGCDetails (打印詳細 GC 日志)
        • -XX:+PrintGCDateStamps (在 GC 日志中添加時間戳)
        • -XX:+PrintCommandLineFlags (打印 JVM 啟動時使用的 -XX 標志)
        • -XX:NativeMemoryTracking=summary/detail (啟用 NMT 跟蹤本地內存)
      • 其他:
        • -XX:MaxDirectMemorySize=1g (設置直接內存最大容量)
        • -XX:+DisableExplicitGC (禁止顯式調用 System.gc())
  4. 程序參數

    • 位置:-jar <jarfile> 或主類名 之后 的所有參數。
    • 作用: 傳遞給 Java 應用程序的 main(String[] args) 方法的參數。
    • 示例: java -jar myapp.jar arg1 arg2 arg3,在 main 方法中 args[0]="arg1", args[1]="arg2"

二、深入理解 -D:系統屬性的強大應用

-D 是配置 Java 應用最常用、最核心的機制。其核心原理與用途如下:

  1. 核心原理:

    • 在 JVM 啟動時,將指定的鍵值對 (<name>=<value>) 加載到 JVM 內部的全局 Properties 集合中。
    • 應用程序在運行時可以通過 System.getProperty(String name)System.getProperty(String name, String default) 方法讀取這些值。
    • 許多流行的框架和庫(如 Spring Boot, Tomcat, Logback, Log4j)都深度依賴系統屬性進行配置。
  2. 常見應用場景:

    • 配置服務器端口: -Dserver.port=8088
    • 激活配置文件: -Dspring.profiles.active=production
    • 指定日志配置文件:
      • Logback: -Dlogback.configurationFile=/path/to/logback.xml
      • Log4j2: -Dlog4j.configurationFile=/path/to/log4j2.xml
    • 設置文件編碼: -Dfile.encoding=UTF-8
    • 設置時區: -Duser.timezone=Asia/Shanghai
    • 覆蓋配置文件中的屬性: -Dmyapp.config.db.url=jdbc:mysql://newhost:3306/db
    • 開啟調試/診斷模式: -Dmyapp.debug=true
    • 設置網絡偏好: -Djava.net.preferIPv4Stack=true
    • 配置臨時目錄: -Djava.io.tmpdir=/mytemp
  3. 如何在代碼中使用:

    public class MyApp {public static void main(String[] args) {// 讀取 server.port 屬性,如果未設置則使用默認值 8080String port = System.getProperty("server.port", "8080");int portNumber = Integer.parseInt(port);// 讀取環境激活配置String activeProfile = System.getProperty("spring.profiles.active", "default");System.out.println("Server will start on port: " + portNumber);System.out.println("Active profile: " + activeProfile);// ... 應用啟動邏輯}
    }
    

三、關鍵使用說明與最佳實踐

  1. 參數順序至關重要:

    • -D-X-XX 等 JVM 選項 必須放在 java 命令之后,但在 -jar <jarfile> 或主類名之前
    • 程序參數 必須放在 -jar <jarfile> 或主類名 之后
    • 錯誤示例: java -jar myapp.jar -Dport=8080 (這里的 -Dport=8080 會被傳遞給 main 方法的 args,而不是作為系統屬性設置!)
  2. 值中的空格與特殊字符:

    • 如果屬性值包含空格,必須用引號括起來
    • 示例: java -Dmessage="Hello World" -jar myapp.jar
  3. 查看可用選項:

    • java -? / java -help: 顯示標準選項。
    • java -X: 顯示非標準選項 (-X 選項) 的幫助。
    • java -XX:+PrintFlagsFinal: 顯示所有 -XX 選項及其當前值(輸出非常龐大,通常結合 grep 使用)。
  4. 選擇正確的參數類型:

    • 應用配置 (端口、環境、文件路徑、業務參數): 優先使用 -D (系統屬性)。這是最通用、最符合應用邏輯的方式。
    • JVM 資源管理 (堆大小、棧大小): 使用 -Xms, -Xmx, -Xss
    • JVM 高級調優與診斷 (GC 選擇、日志、內存跟蹤): 使用 -XX: 選項。使用前務必查閱對應 JVM 版本的文檔。
  5. 環境變量替代:

    • 系統屬性 (-D) 也可以通過環境變量設置,但 Java 代碼讀取方式不同 (System.getenv() vs System.getProperty())。框架通常優先支持系統屬性。
    • Shell 腳本示例 (動態設置):
      #!/bin/bash
      APP_PORT=${APP_PORT:-8080} # 默認值 8080
      ACTIVE_PROFILE=${ACTIVE_PROFILE:-dev} # 默認值 devjava -Dserver.port=$APP_PORT \-Dspring.profiles.active=$ACTIVE_PROFILE \-Xms256m -Xmx1024m \-jar /path/to/xdr-demo-1.0-SNAPSHOT-assembly.jar &
      
  6. & 符號:

    • 在命令末尾的 &Shell 的特性,并非 Java 命令參數。它表示將進程放入后臺運行,釋放當前終端窗口。在 Windows 命令提示符下通常無效。

四、總結

熟練掌握 Java 命令行參數(尤其是 -D 系統屬性、-Xms/-Xmx 堆設置、-Xss 棧設置以及關鍵的 -XX: 調優選項)是高效部署、配置和調優 Java 應用程序的基礎技能。

  • -D 用于靈活傳遞應用配置。
  • -Xms/-Xmx 是性能基石: 合理設置堆內存大小避免 OOM 或浪費資源。
  • -XX: 是調優利器 (謹慎使用): 深入 JVM 內部進行精細控制。
  • 嚴格遵守參數順序: 確保 JVM 能正確識別選項和應用參數。

理解這些參數的作用和用法,結合應用的具體需求(如框架要求、性能指標、診斷需求)進行配置,是保障 Java 應用穩定、高效運行的關鍵一步。務必在生產環境部署前進行充分的測試,特別是涉及 -XX: 高級選項的更改。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/87999.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/87999.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/87999.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【論文筆記】World Models for Autonomous Driving: An Initial Survey

原文鏈接&#xff1a;https://ieeexplore.ieee.org/abstract/document/10522953 1. 世界模型的發展 A. 世界模型的結構基礎 世界模型包含4個關鍵組件&#xff0c;以模擬人類連貫的思考和決策過程。 a&#xff09;感知模塊使用如變分自編碼器&#xff08;VAE&#xff09;、掩…

Spring Cloud Config(微服務配置中心詳解)

關鍵詞&#xff1a;Spring Cloud Config、配置中心、遠程倉庫、動態刷新、加密解密 ? 摘要 在微服務架構中&#xff0c;隨著服務數量的增加&#xff0c;統一管理各服務的配置信息變得尤為重要。傳統的本地配置文件方式難以滿足多環境、多實例、集中化的需求。 Spring Cloud …

【Note】《深入理解Linux內核》 第二十章:深入理解 Linux 程序執行機制

《深入理解Linux內核》 第二十章&#xff1a;深入理解 Linux 程序執行機制&#xff08;Program Execution&#xff09;關鍵詞&#xff1a;exec 系列系統調用、可執行文件格式&#xff08;ELF&#xff09;、用戶地址空間、內存映射、動態鏈接、棧初始化、入口點、共享庫、內核態…

服務器如何配置防火墻規則以阻止惡意流量和DDoS攻擊?

防火墻是保護服務器免受惡意流量和 DDoS 攻擊的第一道防線。通過合理配置防火墻規則&#xff0c;可以有效阻止惡意訪問、限制不必要的流量&#xff0c;并減少攻擊對服務器的影響。以下是配置防火墻規則的全面指南&#xff0c;包括基礎規則設置、防御 DDoS 攻擊的高級策略和最佳…

持續性投入是成就自我價值的關鍵一環

概述 時間&#xff0c;的唯一公平之處就是給你我的長度是相同的&#xff0c;這也是它唯一公平&#xff0c;也是不公平的地方。 所謂的公平&#xff0c;就是不患寡而患不均中所說的平均。 所謂的不公平就是&#xff0c;相同時間內我們彼此對應的標價不同&#xff0c;延伸到后…

使用allegro在BoardGeometry的Silkscreen_Top層畫出圖案

目錄 1. 圖形及圖形放置顯示2. 繪制 1. 圖形及圖形放置顯示 繪制完成圖案&#xff1a; 導出后圖案&#xff1a; 2. 繪制 圖層選中&#xff1b; 畫圓型&#xff1b; 半徑3.5mm&#xff0c;原點生成&#xff1b; 在圖案中挖空&#xff1b; 用指令走線&#xff1a; …

Kotlin 協程:Channel 與 Flow 深度對比及 Channel 使用指南

前言 在 Kotlin 協程的異步編程世界里&#xff0c;Channel 和 Flow 是處理數據流的重要工具&#xff0c;它們有著不同的設計理念與適用場景。本文將對比二者功能與應用場景&#xff0c;詳細講解 Channel 的使用步驟及注意事項 。 一、Channel 與 Flow 的特性對比 Channel 是協程…

MYsql主從復制部署

MySQL 主從復制是將主數據庫的變更自動同步到從數據庫的過程&#xff0c;常用語讀寫分離、高可用性和數據備份。 1.環境準備 確保主從服務器已安裝相同版本的 MySQL&#xff0c;并能通過網絡互相訪問。 # 檢查 MySQL 版本 mysql -V 2.配置主服務器 &#xff08;1&#xff0…

安燈呼叫看板如何實現汽車生產異常秒級響應

在汽車零部件工廠的靜置車間&#xff0c;傳統生產管理依賴人工巡檢與紙質記錄&#xff0c;存在效率低、信息滯后、異常響應慢等問題。某汽車廠曾因物料靜置時間未及時監控&#xff0c;導致批次混料&#xff0c;損失超10萬元。而安燈呼叫看板系統的引入&#xff0c;通過實時狀態…

構造函數注入在spring boot 中怎么使用詳解

我們來詳細講解一下在 Spring Boot 中如何使用構造函數注入&#xff0c;并通過一個完整的、可運行的例子來演示。 構造函數注入是 Spring 官方最推薦的依賴注入方式&#xff0c;因為它能保證對象的不可變性和依賴的完整性。 核心理念 在 Spring Boot 中使用構造函數注入非常簡單…

2025.6.30-2025.7.06第26周:第一次參加頭馬演講俱樂部

現在是周一早上6:23&#xff0c;我開始寫上周的周總結。 3件超出預期的事 參加頭馬俱樂部絕對是最超出預期的&#xff0c;使得這個周末格外的快樂簡歷的第一版終于改完了&#xff0c;花了好長的時間&#xff0c;其中有一天心情還很蕩&#xff0c;因為&#xff0c;我想&#x…

2025使用VM虛擬機安裝配置Macos蘋果系統下Flutter開發環境保姆級教程--下篇

其實如何安裝VM,如何安裝MACOS網上的教程很多,我只是結合我的體驗重新整理了一次,接下來才進入本教程最核心的部分,Flutter開發環境的配置部分。、一.配置前準備 主要是準備相應的工具包,以及其他虛擬機設置1.工具包 工具包的版本也可以自行配置,我這主要是我使用的是F…

QSPI、OSPI與FSMC的區別與內存映射分析

QSPI、OSPI與FSMC的區別與內存映射分析 基本概念與區別 1. FSMC (靈活靜態存儲控制器) 接口類型&#xff1a;并行接口&#xff0c;通常8/16位數據總線總線標準&#xff1a;傳統并行總線協議速度&#xff1a;相對較低&#xff0c;通常最高約100MHz應用場景&#xff1a;SRAM、NOR…

系統思考與心智模式探索

成長的真正障礙&#xff0c;不是能力的不足&#xff0c;而是看待問題的局限。 在復雜多變的商業環境中&#xff0c;我們往往習慣于解決“眼前”的問題&#xff0c;卻忽視了深藏背后的系統性障礙。我們看到的只是表面的“癥狀”&#xff0c;而真正的根源&#xff0c;卻往往隱藏…

物聯網技術的關鍵技術與區塊鏈發展趨勢的深度融合分析

一、物聯網技術的核心架構與關鍵技術 物聯網技術體系由感知層、網絡層、平臺層、應用層和安全層構成&#xff0c;各層技術協同工作&#xff0c;實現物理世界與數字世界的深度融合。 感知層&#xff1a;物聯網的“感官” 傳感器技術&#xff1a;包括環境傳感器&#xff08;溫度…

針對Exhcnage Server的攻擊防范措施

一、背景介紹最近&#xff0c;安全研究人員揭露了一個名為 NightEagle&#xff08;又名 APT-Q-95&#xff09; 的高級持續性威脅&#xff08;APT&#xff09;組織。這個組織被觀察到利用 Microsoft Exchange 服務器中的零日漏洞鏈 進行攻擊&#xff0c;其主要目標是中國政府、國…

編程基礎:繼承

能幫到你的話&#xff0c;就給個贊吧 &#x1f618; 文章目錄繼承&#xff1a;使用基類成員&#xff1a;前提——派生類必須同樣支持基類成員(組件和功能)示例&#xff1a;動物Animal 有 鰓 和 會飛。則 鳥Bird 不是 Animal&#xff0c;因為Bird雖會飛&#xff0c;卻沒有鰓。魚…

TMC4361A 使用(未驗證)

prompt 我用STM32F103C8T6 來控制 TMC4361A 運動控制芯片 &#xff0c;我配置 STM32F103C8T6 的 SPI1 與 TMC4361A 進行通信&#xff0c;配置 PA4 作為片選線&#xff0c;配置 PA8 作為 RCC_MCO 輸入時鐘輸入到 TMC4361A, 并將其連接到TMC4361A的CLK_EXT引腳。我想控制 TMC4361…

深度剖析:如何解決Node.js中mysqld_stmt_execute參數錯誤

在Node.js后端開發中&#xff0c;使用mysql2等數據庫驅動與MySQL/MariaDB交互時&#xff0c;Incorrect arguments to mysqld_stmt_execute 是一個令人頭疼的錯誤。它通常意味著你傳遞給SQL預處理語句的參數數量與SQL字符串中問號&#xff08;?&#xff09;占位符的數量不匹配。…

Vue3 學習教程,從入門到精通,Vue 3 安裝指南及語法知識點詳解(2)

Vue 3 安裝指南及語法知識點詳解 本文將詳細介紹 Vue 3 的所有安裝方式&#xff0c;并深入講解 Vue 3 的語法知識點。此外&#xff0c;還將提供一些綜合性案例&#xff0c;展示如何綜合運用 Vue 3 的各項功能。一、安裝 Vue 3 的所有方式 Vue 3 提供了多種安裝方式&#xff0c;…