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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;…