Scala下设置JVM参数简单分析

Scala 启动shell脚本,简化后的scala REPL 启动命令大致如下所示:

java -Xmx256M -Xms32M \
-Xbootclasspath/a:jline.jar:scala-compiler.jar:scala-library.jar:scalap.jar \
-Dscala.usejavacp=true -Dscala.home=/home/itang/dev-env/typesafe-stack \
-Denv.emacs= \
scala.tools.nsc.MainGenericRunner scala.tools.nsc.CompileServer


经过简单分析得出:
1 Scala命令设置JVM参数的规则:

scala对JVM参数设定分两部分:

A 获取环境变量JAVA_OPTS,如果未设定则默认为:-Xmx256M -Xms32M
B Scala命令参数以-D和-J打头的部分

-D像Java一样,用于设定全局变量值
-J打头的后面的部分会提取为JVM参数, 如:
scala -J-Xmx512m -J-server 相当于java -Xms512 -server


2 JVM 重复的参数设定后声明的会覆盖之前的:
如:

$ export JAVA_OPTS="-Xmx256M -Xms32M"
$ scala -J-Xmx512M


此时,最大堆内存大小为512M

有时默认的Scala设置不满足要求, 如在Scala REPL里测试大量数据:

val large = (1 to (1000 * 10000)).toList


会抛出java.lang.OutOfMemoryError: Java heap space
这时我们要增大堆内存设置, 可以通过添加或修改JAVA_OPTS环境变量或在命令行通过-J-Xmx设置大点的值
如 scala -J-Xmx512m

在这我们可以做个“无聊的”实验看scala REPL启动所需最小的JVM 堆内存值

$ scala -J-Xmx10m


此时提示:

引用
“Error occurred during initialization of VM
Incompatible minimum and maximum heap sizes specified”


出错原因是默认的最小堆size是设置的-Xms32M,最大堆size不应该小于最小堆的size.所以需要同时指定-Xms,以覆盖默认值, 我们100M之内用二分法逐一尝试(也可以写个自动化脚本来干这事)找这个近似值.
在Scala 2.9 下试过之后,得出Scala光启动所需要的最小堆size是25M左右(scala -J-Xms25m -J-Xmx25m)

 

你可能感兴趣的:(scala)