ヒープ領域などのJVM引数の設定

昨日のGroovyの順列生成処理があまりにも遅かったのでヒープ領域の割り当てを増やしてやってみようと思い,まずはヒープ領域の設定方法を調べた.

groovy.batの98行目から108行目あたり.

set JAVA_EXE=%JAVA_HOME%\bin\java.exe
set TOOLS_JAR=%JAVA_HOME%\lib\tools.jar

if "%JAVA_OPTS%" == "" set JAVA_OPTS="-Xmx128m"
set JAVA_OPTS=%JAVA_OPTS% -Dprogram.name="%PROGNAME%"
set JAVA_OPTS=%JAVA_OPTS% -Dgroovy.home="%GROOVY_HOME%"
set JAVA_OPTS=%JAVA_OPTS% -Dtools.jar="%TOOLS_JAR%"
set JAVA_OPTS=%JAVA_OPTS% -Dclassworlds.conf="%CLASSWORLDS_CONF%"

@rem Execute Groovy
"%JAVA_EXE%" %JAVA_OPTS% -classpath "%CP%" %CLASSWORLDS_MAIN_CLASS% groovy %CMD_LINE_ARGS%

変数JAVA_OPTSを事前に設定しておけば読んでくれるらしい.というかデフォルトでXmx128mが設定されていたとは・・・.とりあえずこの状態でヒープ領域を計測.使用したコードは以下.

println "freeMemory  =" + Runtime.getRuntime().freeMemory() + " bytes"
println "totalMemory =" + Runtime.getRuntime().totalMemory() + " bytes"
println "maxMemory   =" + Runtime.getRuntime().maxMemory() + " bytes"

結果は以下.

E:\workspace\GroovyLa>groovy Sandbox.groovy
freeMemory  =1287680 bytes
totalMemory =3194880 bytes
maxMemory   =133234688 bytes
E:\workspace\GroovyLa>

JAVA_OPTSを設定して再度計測.

E:\workspace\GroovyLab>set JAVA_OPTS=-Xms192m -Xmx192m

E:\workspace\GroovyLab>groovy Sandbox.groovy
freeMemory  =196025536 bytes
totalMemory =199819264 bytes
maxMemory   =199819264 bytes

とまあここまでは予想通りだったんだけど,肝心の順列生成の方はというとヒープを256MB割り当てで,

E:\workspace\GroovyLa>groovy Junretsu.groovy
362880パターン生成完了
134373ms
E:\workspace\GroovyLa>

むしろ遅くなってしまった.つまりメモリ量の問題ではなく,単純にオーバーヘッドが大きすぎるということなのか.JDK1.4のリフレクションてこんなに遅かったけ? JDK5.0で試したらもうちょい早いのかな・・・.