Java -D 设置系统属性讲解

本贴最后更新于 1903 天前,其中的信息可能已经时异事殊

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa
版权协议,转载请附上原文出处链接和本声明。
本文链接: http://blog.shiyi.online/articles/2019/08/15/1565861655572.html

我们在用 Java 命令来启动一个项目的时候,会有很多可选的参数,比如-XX 用来配置虚拟机的大小,今天我们看一看 -D 这个选项的用法;

用法说明

-Dkey=value

   在虚拟机的系统属性中设置属性名的键值对,运行在此虚拟机上的应用程序可用 System.getProperty("key") 来获取 value

这样一个用法,我们就可以在启动项目的时候指定全局参数了,比如在启动的时候选择是 单机模式,还是集群模式启动;
例如 Nacos 单机启动的时候

 sh startup.sh -m standalone

我们看看这个 startup.sh 是怎么启动的

# JVM Configuration

if [[ "${MODE}" == "standalone" ]]; then
    JAVA_OPT="${JAVA_OPT} -Xms512m -Xmx512m -Xmn256m"
    JAVA_OPT="${JAVA_OPT} -Dnacos.standalone=true"
else
    JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
    JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${BASE_DIR}/logs/java_heapdump.hprof"
    JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages"

fi

看最终 JAVA_OPT

 JAVA_OPT="${JAVA_OPT} -Xms512m -Xmx512m -Xmn256m"   JAVA_OPT="${JAVA_OPT} -Dnacos.standalone=true"

这里的 -Dnacos.standalone=true 我们就可以在系统中用 System.getProperty("nacos.standalone") 获取到的值就是 true 了;

顺便看下 Nacos 中是是不是用这个方法获取的 Jvm 属性呢


 /**
     * Standalone mode or not
     */
    public static final boolean STANDALONE_MODE = Boolean.getBoolean(STANDALONE_MODE_PROPERTY_NAME);

这个 Boolean.getBoolean()方法最终也是调用了 System.getProperty("nacos.standalone")方法的

public static boolean getBoolean(String name) {
        boolean result = false;
        try {
            result = parseBoolean(System.getProperty(name));
        } catch (IllegalArgumentException | NullPointerException e) {
        }
        return result;
    }

用法注意

  • 如果 vaule 中有空格,则需要用双引号将该值括起来,如:-Dname='Eleven name'.
  • 这个是需要设置 JVM 的参数而不是 program 的参数(就是那个 args)
  • 使用此参数的参数优先级最高,会覆盖项目中配置的此项

Spring 中配置优先级

关于上面的第三点, 优先级最高的问题;
在整个 Jvm 运行期间,我们可以随时随地获取到 2 个与环境相关的参数:

//env是与操作系统相关的参数 
Map<String, String> env = System.getenv(); 
//properties中是Jvm相关的参数
Properties p = System.getProperties();
System.out.println("env :" + env); 
System.out.println("properties :" + p);

如果没有人为的添加额外信息,System::getEnv 获取的数据都与当前的操作系统相关(以下称为“操作系统参数”),而 System::getProperties 获取的内容都与 Jvm 相关(以下称为“JVM 参数”)。

Spring 会将操作系统参数和 Jvm 参数都整合到自己的环境管理接口 Environment 中

通常情况下,在 Environment 内部维护了 2 个 PropertySources 的实例:一个是操作系统参数,另外一个是 JVM 参数。如果 2 者有同样的参数,那么我们在调用 Environment::getProperty 方法时,得到的是 JVM 参数(System::getProperties),也就是说 Jvm 参数具有更高的优先级;

此部分内容引用:Spring 核心--资源数据管理

Idea 中怎么添加 Jvm 的属性

以 Nacos 为例
image.png
这样子启动之后,nacos 就是以单机模式运行了

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...