李锋镝的博客

  • 首页
  • 时间轴
  • 说说
  • 每日心情
  • Now
  • 系列文章
  • 论坛
  • 左邻右舍
    • 左邻右舍
    • 博友圈
  • 留言
    • 留言
    • 走心评论
  • 关于
    • 关于本站
    • 网站地图
    • 网站统计
    • 另一个网站
    • 我的导航站
    • 赞助
  • 🚇开往
!Destiny
惟坚韧者始能遂其志
  1. 首页
  2. 原创
  3. 技术
  4. 正文

JVM参数中的-D是什么意思

2025年6月23日 约 797 字3 分钟 120 0 0
本文最后更新于 2025年6月23日,距今已 457 天,其中的信息可能已经发生变化,请注意甄别。

在JVM(Java虚拟机)参数中,-D 是一个非常重要的选项,用于在启动Java程序时设置系统属性(System Properties)。这些属性可以在程序中通过 System.getProperty() 方法访问,主要用于动态配置应用行为、传递环境变量或自定义参数。

一、核心作用

-D 的作用是在JVM启动时设置系统属性,格式为:

-D<propertyName>=<propertyValue>

例如:

java -Dserver.port=8080 -Dapp.env=prod MainClass

在Java代码中,可以通过以下方式获取这些属性:

String port = System.getProperty("server.port");  // 返回 "8080"
String env = System.getProperty("app.env");      // 返回 "prod"

二、常见应用场景

1. 配置应用参数

  • 数据库连接信息:
    java -Ddb.url=jdbc:mysql://localhost:3306/mydb \
       -Ddb.username=root \
       -Ddb.password=secret \
       MainClass

    在代码中:

    String url = System.getProperty("db.url");

2. 控制日志行为

  • 设置日志级别:
    java -Dlog.level=DEBUG MainClass

    在日志配置中引用:

3. 指定文件编码

  • 解决中文乱码问题:
    java -Dfile.encoding=UTF-8 MainClass

4. 自定义系统行为

  • 启用/禁用功能:
    java -Dfeature.flag=true MainClass

5. 容器化环境配置

  • 从环境变量传递到Java程序:
    java -Dserver.port=$PORT MainClass

三、与其他JVM参数的区别

参数类型 示例 作用范围 访问方式
-D -Dname=value 设置系统属性,应用程序可读取 System.getProperty("name")
-X -Xmx1024m 设置非标准JVM选项(如堆内存大小) JVM内部使用
-XX -XX:+UseG1GC 设置高级JVM选项(如垃圾回收器) JVM内部使用
-classpath -cp lib/* 指定类路径 JVM加载类时使用

四、使用注意事项

  1. 属性名的命名规则

    • 建议使用点分格式(如 app.name)以提高可读性。
    • 避免与JVM内置属性冲突(如 java.home、os.name)。
  2. 空格处理

    • 如果值包含空格,需要用引号包裹:
      java -Ddescription="Hello World" MainClass
  3. 优先级

    • 命令行 -D 参数会覆盖系统环境变量和代码中 System.setProperty() 的默认值。
  4. 安全性

    • 敏感信息(如密码)建议通过更安全的方式传递(如环境变量或配置文件),避免在命令行中明文显示。

五、示例代码

以下Java程序演示如何读取 -D 设置的属性:

public class SystemPropertyDemo {
    public static void main(String[] args) {
        // 获取系统属性
        String appName = System.getProperty("app.name", "DefaultApp");
        String env = System.getProperty("app.env", "dev");
        boolean debug = Boolean.parseBoolean(System.getProperty("debug", "false"));

        // 输出属性值
        System.out.println("应用名称: " + appName);
        System.out.println("运行环境: " + env);
        System.out.println("调试模式: " + debug);

        // 获取所有系统属性
        System.getProperties().forEach((k, v) -> {
            System.out.println(k + " = " + v);
        });
    }
}

运行命令:

java -Dapp.name=MyApp -Dapp.env=prod -Ddebug=true SystemPropertyDemo

六、常见内置系统属性

属性名 说明 示例值
java.version Java版本号 17.0.2
java.home JRE安装目录 /usr/lib/jvm/java-17-openjdk
os.name 操作系统名称 Linux 或 Windows 10
user.dir 当前工作目录 /home/user/projects
user.home 用户主目录 /home/user
file.encoding 文件编码 UTF-8

通过 -D 参数,你可以在不修改代码的情况下动态调整应用行为,这在不同环境(开发、测试、生产)部署时尤为有用。

注意:SpringBoot 的优先级规则是:命令行参数 > JVM 参数 > 配置文件 > 默认值。

除非注明,否则均为李锋镝的博客原创文章,转载必须以链接形式标明本文链接

本文链接:https://www.lifengdi.com/article/tech/4471

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
分享到

JVM参数中的-D是什么意思

也可使用浏览器菜单中的「分享」功能

微信扫一扫分享

标签: JAVA JVM SpringBoot 配置文件
最后更新:2025年6月23日

岁月同一天 9 月 23 日

回望过去的今天,你在写什么

  • 代码人生
    1 年前 2025年9月23日
    Consul开启transparent-proxy访问外部资源的时候,请求偶发Connection reset问题分析

    在Consul中启用透明代理(Transparent Proxy)后,访问外部资源出现偶发Connection rese…

  • 其他
    7 年前 2019年9月23日
    Idea激活码

    2020.4.21到期 亲测有效 812LFWMRSH-eyJsaWNlbnNlSWQiOiI4MTJMRldNUlNI…

相关文章
  • 为什么 SpringBoot 宁可挨骂也要干掉 spring.factories?2025年9月5日
  • 带颜色的JVM:三色标记详解2021年10月9日
  • jstat命令使用(JDK1.8)2020年8月12日
  • 关闭apache httpclient4.5 DEBUG日志2019年7月9日
  • JAVA之从线程安全说到锁2019年10月12日

李锋镝

既然选择了远方,便只顾风雨兼程。

打赏 点赞
< 上一篇
下一篇 >
1234567891112131415161718192021222324252627282930313233343536373839404142434446474849505152535455575859606162636465666769727476777879808182858687909293949596979899
取消回复
…

文章评论

还没有评论,快来抢沙发吧~

秋天是倒放的春天,晚安是爱你的序篇。

听点儿音乐吧 朋友~
文章目录
最新 热点 随机
最新 热点 随机
Redis7+&8.X 全新进阶系列(02):Redis Functions 详解——替代Lua脚本的官方轻量化函数方案 Redis7.x&8.x 全新进阶系列(01):划时代升级总览——从6.x到7.x/8.x全版本变革全景 让WordPress静态化之Rocket‑Nginx WordPress下一代默认主题Ipsum预览 C++之父重磅发声:AI编程正在毁掉一代程序员 支撑全网40%网站的WordPress正在重新拥抱PHP生态
关于主题加载速度优化的一点儿小演进给主题增加了Now、每日心情、年度回顾、岁月同一天、随机漫步等功能WordPress缓存插件WP Fastest Cache、WP Rocket 、FlyingPress对比关于使用AI的一些思考WordPress下一代默认主题Ipsum预览Kratos+ v1.1.16版本更新说明
Spring WebFlux深度解析:异步非阻塞架构与实战落地指南 Claude-HUD 使用文档 【漫画】戏说外行对程序员的误会有多深 Java数组类型 规范驱动AI编程:用OpenSpec实现100%可控开发,从需求到代码的全流程闭环 CPU飙高,系统性能问题如何排查?
最近评论
李锋镝 发布于 23 小时前(09月22日) 是的,换风格了,不过我觉得之前的年份命名挺好的,一看就知道哪一年的
obaby 发布于 1 天前(09月22日) 我现在是个假的wp了,哈哈哈 wp终于改了主题的命名风格了
李锋镝 发布于 3 天前(09月20日) 静态博客我之前也用过,但是感觉不是很方便,后来就一直用的WordPress
Sheep5 发布于 3 天前(09月20日) 我直接用静态博客,天然有速度优势。
不凡 发布于 3 天前(09月20日) 主要是wordpress插件丰富,需要什么功能插件,插件市场应有尽有,typecho是性能更好、更轻...
标签聚合
K8s Spring 数据库 SpringBoot MySQL AI编程 JVM Claude 日常 AI WordPress IDEA 架构 多线程 ElasticSearch 分布式 SQL Theme JAVA Redis
友情链接
  • Mr.Sun的博客
  • 若梦博客
  • 韩小韩博客
  • 老张博客
  • lijie blog
  • 韩情脉脉
  • 蜗牛工作室
  • 知向前端
  • 临窗旋墨
  • 懋和道人
  • 彬红茶日记
  • 哥斯拉
  • 林羽凡
  • 皮皮社
  • 志文工作室
  • sssr7844的博客
  • 瓦匠个人小站
  • 九仞之行
  • Honesty
  • Serendipity

COPYRIGHT © 2016-2026 lifengdi.com. ALL RIGHTS RESERVED.

lifengdi.com

Domain age badge for lifengdi.com

Theme Kratos-plus By Dylan Li

津ICP备2024022503号-3

京公网安备11011502039375号