CLOVER🍀

That was when it all began.

sbtでOutOfMemoryErrorを回避する

Jettyを使ってjetty-run、jetty-stopとかprepare-webappとかを繰り返していると、そのうちPermanentを使い切ってOutOfMemoryErrorが発生します。

こんな感じ。

[info] Compiling 1 Scala source to /xxxxx/hello-servlet/target/scala-2.9.0.final/classes...
java.lang.OutOfMemoryError: PermGen space
	at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:222)
	at java.util.concurrent.FutureTask.get(FutureTask.java:83)
	at sbt.CompletionService$$anon$1.take(CompletionService.scala:29)
	at sbt.Execute.next$1(Execute.scala:74)
	at sbt.Execute.processAll(Execute.scala:77)
	at sbt.Execute.runKeep(Execute.scala:57)
	at sbt.Execute.run(Execute.scala:51)
	at sbt.EvaluateTask$.runTask(EvaluteTask.scala:83)
	at sbt.Aggregation$$anonfun$7.apply(Aggregation.scala:85)
	at sbt.Aggregation$$anonfun$7.apply(Aggregation.scala:85)
	at sbt.EvaluateTask$.withStreams(EvaluteTask.scala:65)
	at sbt.Aggregation$.runTasks(Aggregation.scala:85)
	at sbt.Aggregation$$anonfun$applyTasks$1.apply(Aggregation.scala:74)
	at sbt.Aggregation$$anonfun$applyTasks$1.apply(Aggregation.scala:73)
	at sbt.Command$$anonfun$applyEffect$2$$anonfun$apply$3.apply(Command.scala:63)
	at sbt.Command$$anonfun$applyEffect$2$$anonfun$apply$3.apply(Command.scala:63)
	at sbt.Command$.process(Command.scala:91)
	at sbt.MainLoop$$anonfun$next$1$$anonfun$apply$1.apply(Main.scala:72)
	at sbt.MainLoop$$anonfun$next$1$$anonfun$apply$1.apply(Main.scala:72)
	at sbt.State$$anon$1.process(State.scala:54)
	at sbt.MainLoop$$anonfun$next$1.apply(Main.scala:72)
	at sbt.MainLoop$$anonfun$next$1.apply(Main.scala:72)
	at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:13)
	at sbt.MainLoop$.next(Main.scala:72)
	at sbt.MainLoop$.run(Main.scala:63)
	at sbt.xMain.run(Main.scala:33)
	at xsbt.boot.Launch$.run(Launch.scala:54)
	at xsbt.boot.Launch$$anonfun$explicit$1.apply(Launch.scala:43)
	at xsbt.boot.Launch$.launch(Launch.scala:68)
	at xsbt.boot.Launch$.apply(Launch.scala:14)
	at xsbt.boot.Boot$.runImpl(Boot.scala:24)
	at xsbt.boot.Boot$.main(Boot.scala:15)
Error during sbt execution: java.lang.OutOfMemoryError: PermGen space

これを起こりにくくするには、以下を参考にsbtの起動スクリプトを修正します。
http://www.assembla.com/wiki/show/liftweb/Using_SBT

java -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256m -Xmx512M -Xss2M -jar `dirname $0`/sbt-launch.jar "$@"

クラスのアンロードを有効に、Permanentを拡大ってことのようで。

ところでJetty 8を使っていると、ちょっとOutOfMemoryErrorが起こりにくくなっているような気がするのですが…。