ヒープ領域などの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で試したらもうちょい早いのかな・・・.