题目
对于 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
:新生代中eden
和survivor
空间比例;
因此,题目中最小内存值为 10240m;而在新生代中,由一个 eden
和 两个 survivor
区组成,所以 3x + x + x = 5120m,所以 survivor
区总大小为 2048m;答案为:D。
Java 启动参数
启动 Java 应用时,会执行如下命令:
1 | java [options] classname [args] |
其中 options
为可选启动参数项, args
为 main
方法 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