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