java 启动器会启动 JVM 实现;许多标志是 HotSpot 实现选项,而不是 Java 语言或
JVM 规范要求。应使用应用所部署 JDK 版本对应的启动器文档,因为不同版本之间的可用
选项和默认值会发生变化。
选项类别 #
标准选项包括 --class-path、--module-path、-Dname=value 和 -version。
HotSpot 使用 -X 表示非标准选项,使用 -XX: 表示诊断和高级标志。
JDK_JAVA_OPTIONS 会将选项前置到其环境中的每次启动器调用之前,因此应仅将其用于
受控运行时环境;当进程行为异常时,也应检查该变量。
sh
java --class-path app.jar com.example.Main
java --module-path mods --module com.example.app/com.example.Main
java -Duser.timezone=UTC -jar app.jar堆和本机内存 #
-Xms 设置初始堆大小,-Xmx 设置最大堆大小。使用 k、m 和 g 等二进制后缀;
不带后缀时,数值的单位是字节。堆并不是进程内存限制:元空间、代码缓存、线程栈、直接
缓冲区、本机库和 JVM 内部结构也会消耗本机内存。
sh
java -Xms512m -Xmx2g -XX:MaxMetaspaceSize=256m -jar app.jar设置容器内存限制时,应为非堆内存预留余量。应在生产负载下检查实际生效的 JVM 标志和 本机内存行为,而不是照搬无关服务的堆内存比例。
线程栈和诊断 #
-Xss 控制为每个 Java 线程分配的本机栈大小。较大的栈可以避免深层递归溢出,但会
减少固定内存预算能够支持的线程数量。-XX:ThreadStackSize 以 KiB 表示相应的
HotSpot 设置。
在现代 JDK 上使用 -Xlog 进行统一 JVM 日志记录,并使用 jcmd <pid> VM.flags 或 VM.command_line 检查正在运行的 HotSpot 进程。仅为经过测量的目的启用
开销较高的诊断标志,并在调查结束后移除这些标志。
评论
在 GitHub 上阅读或评论(发表评论需要登录)