【笔记】Java - VM options、Program arguments、Environment variables、eclipse variables
创始人
2024-03-12 17:28:47
0

java使用ide开发的时候,运行程序(application)前都要设置启动配置: VM options、Program arguments、Environment variables

在这里插入图片描述 在这里插入图片描述

很多时候我们是默认配置启动的,所以没太注意。但是如果我们有特殊需求、项目上线时,这些配置就需要特别关注了。

下面看看这三个东西分别怎么搞:

文章目录

      • 虚拟机选项 VM options
        • # 标准参数 -
        • # 非标准参数 -X
        • # 非Stable参数 -XX
      • 程序参数 Program arguments
      • 环境变量 Environment variables
      • eclipse variables

虚拟机选项 VM options

可以分为三类:

  1. 标准参数(-): 全部的JVM实现都必须实现这些参数的功能,并且向后兼容;
  2. 非标准参数(-X): 默认JVM实现这些参数的功能,可是并不保证全部JVM实现都知足,且不保证向后兼容;
  3. 非Stable参数(-XX),此类参数各个JVM实现会有所不一样,未来可能会随时取消,须要慎重使用;

# 标准参数 -

全部的JVM实现都必须实现这些参数的功能,并且向后兼容;

下面命令可以列出所有标准参数:

$ java
用法: java [-options] class [args...](执行类)或  java [-options] -jar jarfile [args...](执行 jar 文件)
其中选项包括:-d32          使用 32 位数据模型 (如果可用)-d64          使用 64 位数据模型 (如果可用)-server       选择 "server" VM默认 VM 是 server.-cp <目录和 zip/jar 文件的类搜索路径>-classpath <目录和 zip/jar 文件的类搜索路径>用 ; 分隔的目录, JAR 档案和 ZIP 档案列表, 用于搜索类文件。-D<名称>=<值>设置系统属性-verbose:[class|gc|jni]启用详细输出-version      输出产品版本并退出-version:<值>警告: 此功能已过时, 将在未来发行版中删除。需要指定的版本才能运行-showversion  输出产品版本并继续-jre-restrict-search | -no-jre-restrict-search警告: 此功能已过时, 将在未来发行版中删除。在版本搜索中包括/排除用户专用 JRE-? -help      输出此帮助消息-X            输出非标准选项的帮助-ea[:...|:]-enableassertions[:...|:]按指定的粒度启用断言-da[:...|:]-disableassertions[:...|:]禁用具有指定粒度的断言-esa | -enablesystemassertions启用系统断言-dsa | -disablesystemassertions禁用系统断言-agentlib:[=<选项>]加载本机代理库 , 例如 -agentlib:hprof另请参阅 -agentlib:jdwp=help 和 -agentlib:hprof=help-agentpath:[=<选项>]按完整路径名加载本机代理库-javaagent:[=<选项>]加载 Java 编程语言代理, 请参阅 java.lang.instrument-splash:使用指定的图像显示启动屏幕
有关详细信息, 请参阅 http://www.oracle.com/technetwork/java/javase/documentation/index.html。

最经常使用的 -D<名称>=<值> 这个选项,这个选项是设置系统属性(System Property)。

如测试

-Dspring.profiles.active=dev

设置的系统属性,能够经过 System.getProperty() 得到

package test;import java.util.Map.Entry;
import java.util.Properties;public class SystemPropertyTest {public static void main(String[] args) {Properties properties = System.getProperties();for (Entry entry : properties.entrySet()) {System.out.println(String.format("%s: %s", entry.getKey(), entry.getValue()));}}}
java.runtime.name: Java(TM) SE Runtime Environment
sun.boot.library.path: C:\Program Files\Java\jdk1.8.0_301\jre\bin
java.vm.version: 25.301-b09
java.vm.vendor: Oracle Corporation
java.vendor.url: http://java.oracle.com/
path.separator: ;
java.vm.name: Java HotSpot(TM) 64-Bit Server VM
file.encoding.pkg: sun.io
user.country: CN
user.script: 
sun.java.launcher: SUN_STANDARD
sun.os.patch.level: 
java.vm.specification.name: Java Virtual Machine Specification
user.dir: E:\temp1\test
java.runtime.version: 1.8.0_301-b09
java.awt.graphicsenv: sun.awt.Win32GraphicsEnvironment
java.endorsed.dirs: C:\Program Files\Java\jdk1.8.0_301\jre\lib\endorsed
os.arch: amd64
java.io.tmpdir: C:\Users\LAWSSS~1\AppData\Local\Temp\
line.separator: java.vm.specification.vendor: Oracle Corporation
user.variant: 
os.name: Windows 10
sun.jnu.encoding: GBK
java.library.path: C:\Program Files\Java\jdk1.8.0_301\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:/Users/lawsssscat/Desktop/sts-4.16.1.RELEASE//plugins/org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_17.0.4.v20221004-1257/jre/bin/server;C:/Users/lawsssscat/Desktop/sts-4.16.1.RELEASE//plugins/org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_17.0.4.v20221004-1257/jre/bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files\Git\cmd;C:\Program Files\Git\bin;C:\Program Files\nodejs\;C:\Program Files (x86)\Tencent\微信web开发者工具\dll;C:\Program Files\dotnet\;C:\Program Files\lua;C:\Program Files\luarocks;C:\MinGW\bin;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;C:\Program Files\MySQL\MySQL Utilities 1.6\;C:\Program Files\MySQL\MySQL Shell 8.0\bin\;C:\Ruby31-x64\bin;C:\Ruby24-x64\bin;C:\Users\lawsssscat\AppData\Local\Microsoft\WindowsApps;C:\Program Files\qemu;C:\Users\lawsssscat\AppData\Roaming\npm;C:\Users\lawsssscat\AppData\Local\Programs\Microsoft VS Code\bin;C:\Program Files\ffmpeg\bin;E:\nodejs\node_global;C:\Users\lawsssscat\AppData\Local\GitHubDesktop\bin;C:\Users\lawsssscat\AppData\Local\Programs\Python\Python310;C:\Users\lawsssscat\Desktop\cmder;C:\cmake\bin;C:\bash_extend;F:\bin_java\apache-maven-3.8.6\bin;C:\Program Files\Java\jdk1.8.0_301\bin;F:\bin_db\mysql-8.0.31-winx64\bin;;C:\Users\lawsssscat\Desktop\sts-4.16.1.RELEASE;;.
java.specification.name: Java Platform API Specification
java.class.version: 52.0
sun.management.compiler: HotSpot 64-Bit Tiered Compilers
os.version: 10.0
user.home: C:\Users\lawsssscat
user.timezone: 
java.awt.printerjob: sun.awt.windows.WPrinterJob
file.encoding: UTF-8
java.specification.version: 1.8
java.class.path: E:\temp1\test\target\classes;C:\Users\lawsssscat\.m2\repository\com\alibaba\fastjson\1.2.83\fastjson-1.2.83.jar;C:\Users\lawsssscat\.m2\repository\org\mybatis\mybatis\3.5.11\mybatis-3.5.11.jar
user.name: lawsssscat
java.vm.specification.version: 1.8
sun.java.command: test.SystemPropertyTest
java.home: C:\Program Files\Java\jdk1.8.0_301\jre
sun.arch.data.model: 64
user.language: zh
java.specification.vendor: Oracle Corporation
awt.toolkit: sun.awt.windows.WToolkit
java.vm.info: mixed mode
java.version: 1.8.0_301
java.ext.dirs: C:\Program Files\Java\jdk1.8.0_301\jre\lib\ext;C:\Windows\Sun\Java\lib\ext
sun.boot.class.path: C:\Program Files\Java\jdk1.8.0_301\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\rt.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\sunrsasign.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_301\jre\classes
java.vendor: Oracle Corporation
file.separator: \
java.vendor.url.bug: http://bugreport.sun.com/bugreport/
sun.io.unicode.encoding: UnicodeLittle
sun.cpu.endian: little
sun.desktop: windows
sun.cpu.isalist: amd64

💡 提示

上述是默认有值的vm标准参数,更多的参数可以自定义,然后在程序中通过 System.getProperty(key) 获取
如: tomcat
在这里插入图片描述

# 非标准参数 -X

默认JVM实现这些参数的功能,可是并不保证全部JVM实现都知足,且不保证向后兼容;

在控制台输入 java -X 可查看全部非标准参数

$ java -X-Xmixed           混合模式执行(默认)-Xint             仅解释模式执行-Xbootclasspath:<用 ; 分隔的目录和 zip/jar 文件>设置引导类和资源的搜索路径-Xbootclasspath/a:<用 ; 分隔的目录和 zip/jar 文件>附加在引导类路径末尾-Xbootclasspath/p:<用 ; 分隔的目录和 zip/jar 文件>置于引导类路径之前-Xdiag            显示附加诊断消息-Xnoclassgc        禁用类垃圾收集-Xincgc           启用增量垃圾收集-Xloggc:    将 GC 状态记录在文件中(带时间戳)-Xbatch           禁用后台编译-Xms        设置初始 Java 堆大小-Xmx        设置最大 Java 堆大小-Xss        设置 Java 线程堆栈大小-Xprof            输出 cpu 分析数据-Xfuture          启用最严格的检查,预计会成为将来的默认值-Xrs              减少 Java/VM 对操作系统信号的使用(请参阅文档)-Xcheck:jni       对 JNI 函数执行其他检查-Xshare:off       不尝试使用共享类数据-Xshare:auto      在可能的情况下使用共享类数据(默认)-Xshare:on        要求使用共享类数据,否则将失败。-XshowSettings    显示所有设置并继续-XshowSettings:system(仅限 Linux)显示系统或容器配置并继续-XshowSettings:all显示所有设置并继续-XshowSettings:vm 显示所有与 vm 相关的设置并继续-XshowSettings:properties显示所有属性设置并继续-XshowSettings:locale显示所有与区域设置相关的设置并继续-X 选项是非标准选项。如有更改,恕不另行通知。

常常使用的jvm堆大小就是经过非标准参数设置的

-Xms        设置初始 Java 堆大小
-Xmx        设置最大 Java 堆大小
-Xss        设置 Java 线程堆栈大小

# 非Stable参数 -XX

关于此类参数的罗列,可以参考官方文档: https://www.oracle.com/java/technologies/javase/vmoptions-jsp.html

此类参数各个JVM实现会有所不一样,未来可能会随时取消,须要慎重使用;

-XX:NewSize=341m,设置年轻代初始值为341M。 -XX:MaxNewSize=341m,设置年轻代最大值为341M。 
-XX:PermSize=512m,设置持久代初始值为512M,但在java8及以后就不支持了,改用XX:MetaspaceSize=512m。 
-XX:MaxPermSize=512m,设置持久代最大值为512M,一样在java8及以后就不支持了,改用-XX:MaxMetaspaceSize=512m。

程序参数 Program arguments

这里的配置参数为主类的main方法的参数

                                  ↓
public static void main(String[] args) {...
}

运行程序时传入

$ java                         ↓
用法: java [-options] class [args...](执行类)                     ↓或  java [-options] -jar jarfile [args...](执行 jar 文件)

环境变量 Environment variables

Environment variables 为环境变量,可经过System.getenv()方法得到。

package test;import java.util.Map;public class EnvironmentTest {public static void main(String[] args) {Map env = System.getenv();for (Map.Entry entry : env.entrySet()) {String key = entry.getKey();String val = entry.getValue();System.out.println(String.format("%s: %s", key, val));}}}
USERDOMAIN_ROAMINGPROFILE: PC-3B8USVE-LAW
LOCALAPPDATA: C:\Users\lawsssscat\AppData\Local
PROCESSOR_LEVEL: 23
USERDOMAIN: PC-3B8USVE-LAW
FPS_BROWSER_APP_PROFILE_STRING: Internet Explorer
LOGONSERVER: \\PC-3B8USVE-LAW
JAVA_HOME: C:\Program Files\Java\jdk1.8.0_301
SESSIONNAME: Console
ALLUSERSPROFILE: C:\ProgramData
PROCESSOR_ARCHITECTURE: AMD64
PSModulePath: C:\Program Files\WindowsPowerShell\Modules;C:\Windows\system32\WindowsPowerShell\v1.0\Modules
SystemDrive: C:
APPDATA: C:\Users\lawsssscat\AppData\Roaming
USERNAME: lawsssscat
ProgramFiles(x86): C:\Program Files (x86)
CommonProgramFiles: C:\Program Files\Common Files
Path: C:/Users/lawsssscat/Desktop/sts-4.16.1.RELEASE//plugins/org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_17.0.4.v20221004-1257/jre/bin/server;C:/Users/lawsssscat/Desktop/sts-4.16.1.RELEASE//plugins/org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_17.0.4.v20221004-1257/jre/bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files\Git\cmd;C:\Program Files\Git\bin;C:\Program Files\nodejs\;C:\Program Files (x86)\Tencent\微信web开发者工具\dll;C:\Program Files\dotnet\;C:\Program Files\lua;C:\Program Files\luarocks;C:\MinGW\bin;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;C:\Program Files\MySQL\MySQL Utilities 1.6\;C:\Program Files\MySQL\MySQL Shell 8.0\bin\;C:\Ruby31-x64\bin;C:\Ruby24-x64\bin;C:\Users\lawsssscat\AppData\Local\Microsoft\WindowsApps;C:\Program Files\qemu;C:\Users\lawsssscat\AppData\Roaming\npm;C:\Users\lawsssscat\AppData\Local\Programs\Microsoft VS Code\bin;C:\Program Files\ffmpeg\bin;E:\nodejs\node_global;C:\Users\lawsssscat\AppData\Local\GitHubDesktop\bin;C:\Users\lawsssscat\AppData\Local\Programs\Python\Python310;C:\Users\lawsssscat\Desktop\cmder;C:\cmake\bin;C:\bash_extend;F:\bin_java\apache-maven-3.8.6\bin;C:\Program Files\Java\jdk1.8.0_301\bin;F:\bin_db\mysql-8.0.31-winx64\bin;;C:\Users\lawsssscat\Desktop\sts-4.16.1.RELEASE;
FPS_BROWSER_USER_PROFILE_STRING: Default
PATHEXT: .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.RB;.RBW
DriverData: C:\Windows\System32\Drivers\DriverData
OS: Windows_NT
COMPUTERNAME: PC-3B8USVE-LAW
PROCESSOR_REVISION: 7100
CommonProgramW6432: C:\Program Files\Common Files
ComSpec: C:\Windows\system32\cmd.exe
ProgramData: C:\ProgramData
ProgramW6432: C:\Program Files
HOMEPATH: \Users\lawsssscat
SystemRoot: C:\Windows
TEMP: C:\Users\LAWSSS~1\AppData\Local\Temp
MYSQL_HOME: F:\bin_db\mysql-8.0.31-winx64
HOMEDRIVE: C:
PROCESSOR_IDENTIFIER: AMD64 Family 23 Model 113 Stepping 0, AuthenticAMD
USERPROFILE: C:\Users\lawsssscat
TMP: C:\Users\LAWSSS~1\AppData\Local\Temp
CommonProgramFiles(x86): C:\Program Files (x86)\Common Files
ProgramFiles: C:\Program Files
PUBLIC: C:\Users\Public
NUMBER_OF_PROCESSORS: 24
windir: C:\Windows
=::: ::\

💡 提示

不难发现,环境变量中很多值和vm options中的-D参数一样,名字也类似。
实际上,应该是后者(vm options)会从前者(environment variable)中取值

eclipse variables

在 eclipse 的其中配置选项中有 variables 这个按钮,选择其中的值会生成 ${...} 插值语法

在这里插入图片描述

这些表达式会根据其内容展示相应的行为,将不同行为获取到的值替换到表达式占位位置

如:

  • ${current_date} 读取系统当前时间
  • ${project_path} 运行项目的路径
  • ${password_prompt} 会弹出对话框,让你输入密码
  • ${file_prompt} 会弹出对话框,让你选择一个文件
  • ${folder_prompt} 会弹出对话框,让你选择一个文件夹
表达式含义
${build_files}返回其修改导致了当前构建的绝对文件系统路径的集合。可将一系列的字符(“a”表示增加(added),“c”表示更改(changed),“r”表示除去(removed),“f”表示仅限文件(files only),“d”表示仅限目录(directories only))作为自变量来提供,以使文件列表仅包含特定类型的变化量。缺省为包含全部变化量。
${build_project}返回其修改导致了当前构建的绝对文件系统路径的集合。可将一系列的字符(“a”表示增加(added),“c”表示更改(changed),“r”表示除去(removed),“f”表示仅限文件(files only),“d”表示仅限目录(directories only))作为自变量来提供,以使文件列表仅包含特定类型的变化量。缺省为包含全部变化量。
${build_type}返回正在执行的构建的类型:“增量”、“完全”、“自动”或“无”。
${container_loc}返回资源的容器的绝对文件系统路径。当没有指定自变量时,目标资源就是选择的资源,否则目标资源是由工作空间相对路径标识的资源。
${container_name}返回资源的容器的名称。当没有指定自变量时,目标资源就是选择的资源,否则目标资源是由工作空间相对路径标识的资源。
${container_path}返回资源的容器的工作空间相对路径。当没有指定自变量时,目标资源就是选择的资源,否则目标资源是由工作空间相对路径标识的资源。
${current_date}返回当前系统的时间,格式为yyyyMMdd_HHmm。可使用可选声明来规定其他的格式。格式必须是java.util.SimpleDateFormat的有效形式。
${eclipse_home}运行中的平台的基本安装位置
${env_var}返回环境变量的值。必须将环境变量名指定为自变量。
${file_prompt}返回在“选择文件”对话框中选择的文件的绝对文件系统路径。当提供一个自变量时,使用它作为对话框标题上的提示。当提供第二个自变量时,使用它作为“选择文件”对话框的初始值。第一个自变量和第二个自变量必须以“:”分隔。
${folder_prompt}返回在“选择目录”对话框中选择的目录的绝对文件系统路径。当提供一个自变量时,使用它作为对话框标题上的提示。当提供第二个自变量时,使用它作为“选择目录”对话框的初始值。第一个自变量和第二个自变量必须以“:”分隔。
${java_extensions_regex}与已注册的类似于 Java 的文件扩展名相匹配的正则表达式
${java_type_name}返回所选资源中主类型的标准 Java 类型名。
${project_classpath}返回该工程的系统路径
${project_loc}返回资源的项目的绝对文件系统路径。当没有指定自变量时,目标资源就是选择的资源,否则目标资源是由工作空间相对路径标识的资源。
${project_name}返回资源的项目的名称。当没有指定自变量时,目标资源就是选择的资源,否则目标资源是由工作空间相对路径标识的资源。
${project_path}返回资源的项目的工作空间相对路径。当没有指定自变量时,目标资源就是选择的资源,否则目标资源是由工作空间相对路径标识的资源。
${resource_loc}返回资源的绝对文件系统路径。当没有指定自变量时,目标资源就是选择的资源,否则目标资源是由工作空间相对路径标识的资源。
${resource_name}返回资源的名称。当没有指定自变量时,目标资源就是选择的资源,否则目标资源是由工作空间相对路径标识的资源。
${resource_path}返回资源的工作空间相对路径。当没有指定自变量时,目标资源就是选择的资源,否则目标资源是由工作空间相对路径标识的资源。
${selected_resource_loc}返回选择的资源的工作空间的文件系统绝对路径
${selected_resource_name}返回选择的资源的名称
${selected_resource_path}返回选择的资源的工作空间的相对路径
${selected_text}返回活动编辑器中当前选择的文本。
${system}返回 Eclipse 系统变量的值。必须将变量名指定为自变量 - 下列其中一个值:ARCH、ECLIPSE_HOME、NL、OS 或 WS。
${system_path}返回外部文件的绝对文件系统路径。通过根据指定的系统路径来查找第一个出现的指定工具来解决。必须将工具名称作为自变量来提供。
${system_property}从 Eclipse 运行时返回系统属性的值。系统属性名必须作为自变量指定。
${workspace_loc}返回工作空间根目录的绝对文件系统路径。当指定了自变量时,返回由工作空间相对路径标识的资源的绝对文件系统路径。

💡 提示

设置后,可以通过 “show command line” 查看具体的值
在这里插入图片描述

💡 提示

更多的值可以自定义

在这里插入图片描述

相关内容

热门资讯

不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
AsusVivobook无法开... 首先,我们可以尝试重置BIOS(Basic Input/Output System)来解决这个问题。...
ASM贪吃蛇游戏-解决错误的问... 要解决ASM贪吃蛇游戏中的错误问题,你可以按照以下步骤进行:首先,确定错误的具体表现和问题所在。在贪...