vm options、program arguments、environment property

2023-05-16

系统变量(system property)

是java应用程序自身指定的变量,通常我们可以在启动应用的时候指定,指定方式可以有以下两种

输入java -jar -help 回顾一下java启动jar文件的命令

java [-options] -jar jarfile [args…]

其中选项options中包括-Dkey=value,对应vm options中的标准参数

其中args即为自定义参数,对应program arguments

前者可以直接通过System.getProperty(key)获取到,后者作为文本传入main函数中,需要进一步处理才能使用,下面进一步介绍

vm options

VM options : JVM虚拟机启动命令可选项,在这里可以设置一些运行参数。

参数大致可分为标准(-D等)和非标准(-X、-XX)两种,非标准的可选项不保证在所有平台上都实现,并且未来的版本中可能会被修改且不告知,总之就是不稳定(Unstable)。不过有的非标准可选项还是非常有用的。(这里不做详细介绍,参考另一文章)

在设置VM参数时,如果我们需要自定义一些参数信息(这个行为称之为,设置系统属性),则必须使用-Dkey=value这种形式,多组参数之间使用空格分隔

通过这里设置的参数,JVM在初始化时,会对System中的Properties进行对应赋值,所以我们也可以通过System.getProperty(String key)获取到(仅限-D形式的键值对标准参数可获取,其他格式以及非标准参数无法读取到)。

非标准参数示例

-Xms1024m,设置JVM初始堆内存为1024m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
-Xmx1024m,设置JVM最大堆内存为1024m。
-Xss512k,设置每个线程的栈大小。JDK5.0以后每个线程栈大小为1M,之前每个线程栈大小为256K。在相同物理内存下,减小这个值能生成更多的线程,当然操作系统对一个进程内的线程数还是有限制的,不能无限生成。线程栈的大小是个双刃剑,如果设置过小,可能会出现栈溢出,特别是在该线程内有递归、大的循环时出现溢出的可能性更大,如果该值设置过大,就有影响到创建栈的数量,如果是多线程的应用,就会出现内存溢出的错误。
-Xmn341m,设置年轻代大小为341m。在整个堆内存大小确定的情况下,增大年轻代将会减小年老代,反之亦然。此值关系到JVM垃圾回收,对系统性能影响较大,官方推荐配置为整个堆大小的3/8。
-XX:NewSize=341m,设置年轻代初始值为341M。
-XX:MaxNewSize=341m,设置年轻代最大值为341M。
-XX:PermSize=512m,设置持久代初始值为512M,但在java8及之后就不支持了,改用-XX:MetaspaceSize=512m。
-XX:MaxPermSize=512m,设置持久代最大值为512M,同样在java8及之后就不支持了,改用-XX:MaxMetaspaceSize=512m。
-XX:NewRatio=2,设置年轻代(包括1个Eden和2个Survivor区)与年老代的比值。表示年轻代比年老代为1:2。
-XX:SurvivorRatio=8,设置年轻代中Eden区与Survivor区的比值。表示2个Survivor区(JVM堆内存年轻代中默认有2个大小相等的Survivor区)与1个Eden区的比值为1:1:8,即1个Survivor区占整个年轻代大小的1/10。
-XX:MaxTenuringThreshold=15,具体参看JVM系列之内存分配和回收策略中对象的衰老过程。
-XX:ReservedCodeCacheSize=256m,设置代码缓存的大小,用来存储已编译方法生成的本地代码。

program arguments

在这里设置的参数是作为main方法的参数String[] args传入的

-Dkey=value属于自动设置环境变量,格式固定,局限性较大

program arguments中的参数,具有很大的灵活性,可以自定义代码进行解析,

下面简单介绍spring中的部分属性解析代码CommandLinePropertySource

CommandLinePropertySource

我们在启动项目时,是可以指定命令行参数 的,诸如:

此类将命令行参数定义为两种:
option arguments:指定方式通常如下 --k=v
non-option arguments:不以诸如 – 之类前缀修饰的属性,被解析为 non-option arguments,诸如 a b c 会被解析为 a,b,c,其 key 为 nonOptionArgs,当然我们也可以通过 setNonOptionArgsPropertyName 方法修改该 key 值

Spring 针对 CommandLinePropertySource 提供了两个实现(当然我们也可以自己实现),分别为 SimpleCommandLinePropertySource 和 JOptCommandLinePropertySource,基本我们用到的也就是 SimpleCommandLinePropertySource 了

SimpleCommandLinePropertySource

在该类中,命令行参数 被解析为 CommandLineArgs,负责解析工作的类是 SimpleCommandLineArgsParser,见其构造方法:

public class SimpleCommandLinePropertySource extends CommandLinePropertySource<CommandLineArgs> {
	public SimpleCommandLinePropertySource(String... args) {
		super(new SimpleCommandLineArgsParser().parse(args));
	}
}

属性获取测试代码

public void command() {
    String[] command = {"--o1=v1", "--o2", "a", "b", "c"};
    SimpleCommandLinePropertySource propertySource
            = new SimpleCommandLinePropertySource("command", command);
    // v1
    String o1 = propertySource.getProperty("o1");
    // ""
    String o2 = propertySource.getProperty("o2");
    // null
    String o3 = propertySource.getProperty("o3");
    // "a,b,c"
    String nonOptionArgs = propertySource.getProperty("nonOptionArgs");
}

实际应用,将args解析到系统变量中

public void source(String... args) {
    simpleCommandLinePropertySource = new SimpleCommandLinePropertySource(args);
    Set<String> stringSet = simpleCommandLinePropertySource.getSource().getOptionNames();
    if (CollectionUtils.isNotEmpty(stringSet)) {
        for (String key : stringSet) {
            String values = simpleCommandLinePropertySource.getProperty(key);
            if (StringUtils.isNotEmpty(key) && StringUtils.isNotEmpty(values)) {
                String oldValue = System.setProperty(key, values);
                LOGGER.info("设置系统环境变量为:{}={}  原来的值为:{}", key, values, oldValue);
            }
        }
    }
}

环境变量(environment property)

可以通过idea的启动参数设置

在spring项目中,同样可以通过@value注解获取到environment property,但是假如存在同名的system property,则会读取后者
另外,spirng项目中,定义了自己的一套解析Program arguments参数的规则,如果有符合格式的Program arguments,
如–serverId=8080,会将此参数解析成对应的system property,且其优先级大于VM options中的同名属性

总之,在spring项目中,三者的优先级
Program arguments (–priority=program-agrs) >
VM options (-Dpriority=vm-options) >
Environment variable (priority=environment-variables)
另外,这三者优先级都高于外部的配置文件,关于这点参考下方链接

这里的环境变量并不是系统级别的环境变量,应该是仅针对此进程,通过System.getEnv(key)可以获取

public static void main(String[] args) {
    Map<String, String> env = System.getenv();
    env.entrySet().forEach(System.out::println);
}

扩展文章
springboot环境之Properties加载详解
https://blog.csdn.net/qq_31086797/article/details/107395108?

spring是如何把environment中的属性值使用@Value注入到字段中的
https://blog.csdn.net/qq_31086797/article/details/124136140

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vm options、program arguments、environment property 的相关文章

  • 设置类型的可变长度参数列表

    好吧 我很确定以前已经以某种方式讨论过这个问题 但我显然太愚蠢了 找不到它 首先 我不是在寻找 va list 和其他宏 我正在寻找类似主函数参数的东西 众所周知 默认原型是 int main int argc char argv 现在 我
  • 如何编写接受无限参数的函数?

    我只能找到one函数采用可变数量参数的方式 是这样的 include
  • 如何将参数传递给通过 Assembly.CreateInstance 加载的 C# 插件?

    我现在拥有的 成功加载插件 是这样的 Assembly myDLL Assembly LoadFrom my dll IMyClass myPluginObject myDLL CreateInstance MyCorp IMyClass
  • 将列表传递给 Tcl 过程

    将列表传递给 Tcl 过程的规范方法是什么 如果我能得到它 以便列表自动扩展为可变数量的参数 我真的很喜欢它 所以像这样 set a b c myprocedure option1 option2 a and myprocedure opt
  • 通过 (...) 时避免参数重复

    考虑功能 f lt function x X mean c x X 我怎样才能自动 通过操纵f 更改签名f 这样它就可以与lapply 即不返回以下明显的错误 lapply X list 1 FUN f X 1 Error in lappl
  • runas 不允许复杂的参数?

    我有一个应用程序 我试图在 Windows 7 和 Windows XP 瘦客户端上运行提升 但我似乎无法正确获取 runas exe 命令行 我知道我需要其中的反斜杠转义字符 以便 runas 正确解释空格 当将 run 作为已用反斜杠转
  • Ruby、Unicorn 和环境变量

    在使用 Heroku 时 我发现他们使用环境变量进行服务器本地配置的方法非常出色 现在 在设置自己的应用程序服务器时 我发现自己想知道复制它有多困难 我正在部署一个 sinatra 应用程序 使用 Unicorn 和 Nginx 我知道ng
  • Powershell:如何使用invoke-command和-filepath远程传递参数?

    所以我发现了很多与此类似的主题 但我找不到与我的问题相关的任何内容 invoke command computername serverLocation Credential cred filepath C path script2 ps1
  • 具有多个参数的 iOS PerformSelectorOnMainThread

    我想从另一个线程在主线程上执行选择器 但选择器有多个参数 类似于 void doSomethingWith int a b float b c float c d float d e float e 我怎样才能让它工作performSele
  • 带选项的 Python 装饰器

    我有一个模块 它的函数原型与线程类的原型类似 def do fn argtuple kwargdict priority 0 block False timeout 0 callback None daemon False do stuff
  • 如何将多个参数作为单个向量传递给函数?

    我使用六个参数创建了以下函数 nDone lt function under strike ttoe vol rf dy pnorm log under strike rf dy vol 2 2 ttoe vol ttoe 0 5 nDon
  • 在 R 中的函数内保存单个对象:RData 文件大小非常大

    我试图在 R 中保存修剪后的 GLM 对象 即所有 非必要 特征设置为 NULL 例如残差 prior weights qr qr 举个例子 看看我需要执行此操作的最小对象 print object size glmObject 16899
  • 如何在表单应用程序中获取参数?

    我可以找到许多有关如何在控制台应用程序中获取参数的示例 但我似乎找不到如何在 Windows 窗体应用程序中获取参数的示例 我想关注以下事情 每当我打开 jpg 文件时 Windows 都会启动我的应用程序 我想知道我的应用程序中 jpg
  • Python默认参数评估[重复]

    这个问题在这里已经有答案了 我正在阅读 Python 文档版本 2 7 10 中的 python 教程 我遇到了类似的内容 Code def fun1 a L L append a return L print fun1 1 print f
  • 关于可用性和“美观”的争论

    作为一名 UI 人员 编码和设计用户界面 我经常发现自己处于一种奇怪的境地 与程序员和其他 外行 争论用户界面的质量 我发现争论颜色 图标或布局之类的事情有点困难 而且似乎没有事实的对错 但是 尽管没有令人信服的论据 我仍然知道 即感觉 有
  • C# 特定进程的参数,使用 url 打开浏览器

    我正在编写一个应用程序 该应用程序应该通过单击按钮来打开某个进程 但是 用户可以添加新按钮 我使用以下代码来执行单击按钮时启动进程的操作 private void StartProcess string path ProcessStartI
  • 使用 perl 包时将参数传递给它

    如何在使用包时传递一些参数 例如 use Test More tests gt 21 我无法找到有关此功能的任何有价值的文档 通过这样的论点有什么优点和缺点吗 use My Module LIST https metacpan org po
  • scikit-learn 中的“详细”参数

    许多 scikit learn 函数都有verbose根据他们的文档 c 控制冗长 越高 消息越多 例如 网格搜索简历 https scikit learn org stable modules generated sklearn mode
  • JavaScript 未知数量的参数

    在我的项目中 我注册了不同的函数 具有不同数量的参数 作为许多事件的侦听器 当事件发生时 我需要触发相关的函数 我接收以数组形式传递给侦听器方法的参数 而侦听器函数需要每个单独的参数 所以 我正在这样做 但我不喜欢这种方法 想知道是否有一种
  • 如何获取 bash 中的第 n 个位置参数?

    如何获得nBash 中的第一个位置参数 其中n是变量吗 使用 Bash 的间接功能 bin bash n 3 echo n 运行该文件 ind apple banana cantaloupe dates 生产 cantaloupe Edit

随机推荐

  • PHP7+apache2.4环境搭建

    PHP 43 apache环境搭建 版本 xff1a PHP Version 7 1 30 apache2 4 下载 xff1a 下载php时 xff0c 注意下载VC14 x64 Thread Safe xff0c 否则没有php7apa
  • JAVA构造器注意事项

    JAVA构造器 1 JAVA默认提供无参构造器 2 默认无参构造器 对域进行初始化规则 数值型 xff1a 0 布尔类型 xff1a false 对象类型 xff1a null 3 如果自己写了一个带参构造器 xff0c 默认的无参构造器失
  • 原生大数据|elasticSearch|低版本kibana组件的汉化

    前言 xff1a 大数据的范畴里包括EFK ELK xff0c 这些套件安装部署是非常的成熟 xff0c 因此是比较好部署安装的 xff0c 一般的 xff0c 困难出现在部署完成后的运营和维护 kibana这个组件的版本低于7我们就应该认
  • JAVA继承-注意事项

    JAVA继承 1 子类所有构造器 xff0c 会隐式调用父类的无参构造器 原理 xff1a 子类所有构造器 xff0c 都会在第一行隐式调用super 问题 xff1a 如果父类没有无参构造器 xff0c 编译报错 解决 xff1a 在子类
  • mac上安装brew出错curl: Failed to connect to raw.githubusercontent.com port 443解决方法

    问题描述 由于最近重做了电脑系统 xff0c 重新下载安装brew 就报错了 xff0c raw githubusercontent com 在国内由于不可描述的原因就无法访问 解决方法一 参考网上的解决方法 首先是访问这个网址 https
  • Hexo + gitHub pages

    网址 xff1a https oldmee github io hexo的写作流程就是会按照日期自动帮你归类 xff0c 你new了一个page会生成一个markdown文件 xff0c 你就可以愉快的写作了 xff0c 边写边看效果 xf
  • 使用策略模式优化过多的if else语句

    此处的过多是指if else超过三层 xff0c 如下面的代码 xff1a public class MainStart public static void main String args String message 61 34 se
  • 在基于图像的深度学习中如何做数据的自动标注以及自动标注的等级介绍

    作者 xff1a Tobias Schaffrath Rosario 编译 xff1a ronghuaiyang 原文 xff1a 在基于图像的深度学习中如何做数据的自动标注以及自动标注的等级介绍 ronghuaiyang的博客 CSDN博
  • 【Java】 牛客网华为机试108题汇总

    文章目录 目录 目录 1 求字符串最后一个单词长度 2 计算字符串个数 3 明明的随机数 4 字符串分割 5 进制转换 6 质数因子 7 HJ19 简单错误记录 8 HJ25 数据分类处理 9 HJ30 字符串合并处理 1 求字符串最后一个
  • OpenCV的简单使用教程与基本函数(C++版本)

    OpenCV的简单使用教程 xff08 C 43 43 xff09 OpenCV简介OpenCV的使用基础打开 显示和保存图像图像存储变量 Mat类图像元素的存储读入图像文件创建Mat类复制Mat类图像元素的访问OpenCV画图命令行交互界
  • 【实用技巧】知网文献不限量免费下载方法,亲测可用

    众所周知 xff0c 知网可以查看和下载相关的文献资料 xff0c 只要用校园网就能免费的下载和查阅 xff0c 但是也有不少学校并没有和知网合作 xff0c 这样就没办法下载 xff0c 只能充钱才能享受 那么有没有白嫖的办法呢 xff1
  • git rm 删除 以及清空暂存区

    一 使用linux命令rm删除 xff1a 在当前工作区有文件readme txt xff0c 并被git跟踪 xff0c 且有提交历史 运行如下命令 xff1a rm readme txt 分析如下 xff1a xff08 1 xff09
  • centOS开启和关闭防火墙

    CentOS 7 0默认使用的是firewall作为防火墙 xff0c 在安装某些软件的时候就需要关闭防火墙 一 查看防火墙的状态 开启显示 running xff0c 关闭后显示 not running 执行命令 firewall cmd
  • postgresql|数据库|pg数据库的文件系统详解---最全面的解析

    前言 xff1a postgresql是一个非常成熟的开源的功能强大的关系型数据库 xff0c 总体来说 xff0c 该数据库安装简单 xff0c 使用复杂 xff0c 复杂度在多个维度都会有所体现 xff0c 比如 xff0c SQL语法
  • k8s部署ingress-nginx的方法步骤

    1 ingress概述 我们知道service的表现形式为IP PORT xff0c 即工作在第四层传输层 xff08 TCP IP层 xff09 xff0c 那么对于不同的URL地址经常对应用不同的后端服务或者虚拟服务器 xff0c 这些
  • 计算机软技术,如何画好一张架构图?

    什么是架构图 xff1f 如何画好一张架构图 xff0c 要做好这件事情首先要回答的就是什么是架构图 我们日常工作中经常能看到各种各样的架构图 xff0c 而且经常会发现大家对架构图的理解各有侧重 深入追究到这个问题 xff0c 可能一下子
  • yum与apt

    linux系统分类 一般来说著名的linux系统基本上分两大类 xff1a 1 RedHat系列 xff1a Redhat Centos Fedora等 2 Debian系列 xff1a Debian Ubuntu等 RedHat 系列 1
  • netstat常用场景记录

    参数说明 netstat命令各个参数说明如下 xff1a a 显示所有连线中的端口 不加此参数默认不显示处于监听状态的端口 n 不进行DNS轮询 xff0c 显示IP 可以加速操作 r 显示路由表信息 t 显示TCP传输协议的端口连线状况
  • log4j动态加载配置文件

    应用场景与问题 当项目在运行时 xff0c 我们如果需要修改log4j 1 X或者log4j2的配置文件 xff0c 一般来说我们是不能直接将项目停止运行再来修改文件重新部署的 于是就有这样一个问题 xff1a 如何在不停止当前项目的运行的
  • vm options、program arguments、environment property

    系统变量 system property 是java应用程序自身指定的变量 xff0c 通常我们可以在启动应用的时候指定 xff0c 指定方式可以有以下两种 输入java jar help 回顾一下java启动jar文件的命令 java o