java使用ide开发的时候,运行程序(application)前都要设置启动配置: VM options、Program arguments、Environment variables
很多时候我们是默认配置启动的,所以没太注意。但是如果我们有特殊需求、项目上线时,这些配置就需要特别关注了。
下面看看这三个东西分别怎么搞:
文章目录
- 虚拟机选项 VM options
- # 标准参数 -
- # 非标准参数 -X
- # 非Stable参数 -XX
- 程序参数 Program arguments
- 环境变量 Environment variables
- eclipse variables
虚拟机选项 VM options
可以分为三类:
- 标准参数(-): 全部的JVM实现都必须实现这些参数的功能,并且向后兼容;
- 非标准参数(-X): 默认JVM实现这些参数的功能,可是并不保证全部JVM实现都知足,且不保证向后兼容;
- 非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[:<packagename>...|:<classname>]
-enableassertions[:<packagename>...|:<classname>]
按指定的粒度启用断言
-da[:<packagename>...|:<classname>]
-disableassertions[:<packagename>...|:<classname>]
禁用具有指定粒度的断言
-esa | -enablesystemassertions
启用系统断言
-dsa | -disablesystemassertions
禁用系统断言
-agentlib:<libname>[=<选项>]
加载本机代理库 <libname>, 例如 -agentlib:hprof
另请参阅 -agentlib:jdwp=help 和 -agentlib:hprof=help
-agentpath:<pathname>[=<选项>]
按完整路径名加载本机代理库
-javaagent:<jarpath>[=<选项>]
加载 Java 编程语言代理, 请参阅 java.lang.instrument
-splash:<imagepath>
使用指定的图像显示启动屏幕
有关详细信息, 请参阅 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<Object, Object> 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:<file> 将 GC 状态记录在文件中(带时间戳)
-Xbatch 禁用后台编译
-Xms<size> 设置初始 Java 堆大小
-Xmx<size> 设置最大 Java 堆大小
-Xss<size> 设置 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<size> 设置初始 Java 堆大小
-Xmx<size> 设置最大 Java 堆大小
-Xss<size> 设置 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<String, String> env = System.getenv();
for (Map.Entry<String, String> 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” 查看具体的值
💡 提示
更多的值可以自定义