字节流的博客

从一道题目开始了解 JVM 配置参数

题目

对于 JVM 内存配置参数:-Xmx10240m -Xms10240m -Xmn5120m -XX:SurvivorRatio=3,其最小内存值和 Survivor 区总大小分别是( )?

A: 5120m,1024m

B: 5120m,2048m

C:10240m,1024m

D:10240m,2048m

解答

  • -Xmx(-Xmxsize):代表最大堆大小,此参数等同于 -XX:MaxHeapSize
  • -Xms(-Xmssize):代表初始堆大小,即最小堆大小;
  • -Xmn(-Xmnsize):新生代的大小;
  • -XX:SurvivorRatio:新生代中 edensurvivor 空间比例;

Java 内存模型(图片来自 bejond.org)

因此,题目中最小内存值为 10240m;而在新生代中,由一个 eden 和 两个 survivor 区组成,所以 3x + x + x = 5120m,所以 survivor 区总大小为 2048m;答案为:D

Java 启动参数

启动 Java 应用时,会执行如下命令:

1
java [options] classname [args]

其中 options 为可选启动参数项, argsmain 方法 public static void main(String[] args) 的字符串数组参数项;下面我们说 options 参数项。

Options

java 命令支持许多种类型的参数,可以分为以下几类:

所有的 JVM 实现都支持标准参数,这些参数用来做一些通用的动作,如:JRE 版本检查,设定 class 路径,启用 verbose 输出等。

非标准参数特指 HotSpot JVM 实现用到的参数,并非所有其他的 JVM 实现都支持这些参数,并且有可能在版本迭代中参数会发生变化,这些参数均以 -X 开头。

高级参数并不推荐随意使用,开发者使用这些参数来调节 HotSpot 指定区域中的值,来满足特定的系统需求或者访问权限控制等。这些参数也并非所有其他的 JVM 实现都支持,并且在后续的版本迭代中可能发生变化。高级参数均以 -XX 开头。

点此查看不推荐的和已删除的参数。

布尔值的参数用来启用和关闭某项功能特性,在参数中,用户 + 号表示启用一项功能,用 - 号表示关闭一项功能。如:-XX:+Optioname 表示关闭 Optionname 特性;

在有些参数选项后需要添加其他参数,有的是以空格分开,有的用 = 号分开,有的用 : 号分开,有的直接在后面添加,不同的参数有不同的写法。如果你想在参数值指定字节大小,可以如下方式表示:

  • k 或者 K 表示千字节;
  • m 或者 M 表示兆字节;
  • g 或者 G 表示吉字节;

如:8g, 1024k, 512M

如果想表达百分比,可以用 0~1 之间的小数表示,如:0.25

常见标准参数

参数说明
-agentlib:libname[=options]加载指定的本地代理库。libname 后可以用逗号分隔添加的多个值。如指定了 -agentlib:foo 时,JVM 会尝试在 LD_LIBRARY_PATH 路径下(OS X 下为 DYLD_LIBRARY_PATH)加载名为 libfoo.so 的库。
-d32在 32 位环境中运行程序。如果 32 位环境未安装或者系统不支持,将会报错。默认情况下应用在 32 位环境中运行,除非使用的是 64 位系统。
-d64在 64 位环境中运行程序。如果 64 位环境未安装或者系统不支持,将会报错。默认情况下应用在 32 位环境中运行,除非使用的是 64 位系统。
-esa/-enablesystemassertions在所有系统类启用断言
-javaagent:jarpath[=options]加载指定的 Java 编程语言代理。详见链接
-server选择使用 Java HotSpot Server VM 虚拟机版本。详见链接
-version输出 JVM 版本并退出。

常见非标准参数

参数说明
-X输出所有可用 -X 参数。
-Xbatch禁用后台编译。默认情况下,JVM 以后台任务形式编译方法,并以解释执行的模式开始运行方法,直至方法编译完成。-Xbatch 禁用后台任务编译后,所有的方法编译任务都变成了前台任务,直至编译完成。此项等同于 -XX:-BackgroundCompilation
-Xcomp强制在第一次调用方法时编译方法(JIT 编译成本地代码,即与所在平台相关的机器码,这个方法或代码就被认为是热点代码,Hot Spot Code)。默认情况下,Client VM(-client)解释执行 1000 个方法调用,Server VM(-server)解释执行 10000 个方法调用,以收集信息来更高效地编译。通过 -Xcomp 选项配置禁止解释方法调用对于提高编译效率来说是很大的损失。
-Xbootclasspath:path以冒号分隔形式指定目录、JAR 文件和 ZIP 压缩包作为 boot class,用以替代 JDK 中自带的 boot class。不要用此选项覆盖 rt.jar 文件,因为这违反了 JRE 二进制代码许可
-Xloggc:filename将 GC 事件日志信息输出重定向到文件 filename
-Xmnsize为堆内存中的新生代设置初始化和最大内存大小。堆内存中新生代用于保存新的对象实例。在新生代中 GC 的次数要比堆中其他区域更为频繁。如果此值设置过小,则会产生许多 Minor GC。如果设置过大,则只会产生 Full GC,然而 Full GC 需要花费很长的时间才可以完成。Oracle 推荐新生代内存大小设置为堆内存总大小的 1/4 - 1/2。
-Xmssize设定堆内存大小初始值。如果此项不填,默认为老年代和新生代分配到的内存之和。堆内存中新生代内存大小可通过 -Xmn 或者 -XX:NewSize 选项配置。
-Xmxsize设定堆内存最大值。此项必须是 1024 的倍数并且大于 2 MB。此项等同于 -XX:MaxHeapSize。默认值取决于运行时的系统配置。详见 Java SE HotSpot Virtual Machine Garbage Collection Tuning Guide
-Xsssize设定线程栈大小。此项等同于 -XX:ThreadStackSize。默认值依赖于平台,详见文档 -Xsssize 配置项。

以上基于 Unix 环境, Java SE 8

参考

Thanks! 😊