CLOVER🍀

That was when it all began.

Java 8をインストールしたら、sbtでMaxMetaspaceSizeを設定する?

sbtをマニュアルに沿って標準的な設定していると、だいたいPermanentを拡張していると思います。

SBT_OPTS="-Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M"
java $SBT_OPTS -jar `dirname $0`/sbt-launch.jar "$@"

Setup#Manual Installation
http://www.scala-sbt.org/release/docs/Getting-Started/Setup.html#manual-installation

で、Java 8をインストールしてsbtを起動すると、こんな感じで警告されます。

$ sbt
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=384M; support was removed in 8.0

*うちは、384Mにしていました…

Java 8から、Permanentがなくなったんでした。

Java 8でPermGenのOutOfMemoryError問題は解決されるのか?
http://www.infoq.com/jp/news/2013/03/java-8-permgen-metaspace

Javaヒープから、ネイティブヒープに移動したとのこと。

ですが、最初から大きめに取るにはMetaspaceSizeを指定し、使用する容量を制限する場合にはMaxMetaspaceSizeを指定するらしいです。無制限に使わないようにねーと。

ちょっと確認してみましょうか。

Java 8。

$ /usr/lib/jvm/java-8-oracle/bin/java -XX:+PrintFlagsFinal -version | grep 'MetaspaceSize'
    uintx InitialBootClassLoaderMetaspaceSize       = 4194304         {product}
    uintx MaxMetaspaceSize                          = 18446744073709547520{product}
    uintx MetaspaceSize                             = 21807104        {pd product}
java version "1.8.0"
Java(TM) SE Runtime Environment (build 1.8.0-b132)
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b70, mixed mode)

Java 7。

$ /usr/lib/jvm/java-7-oracle/bin/java -XX:+PrintFlagsFinal -version | grep Perm
    uintx AdaptivePermSizeWeight                    = 20              {product}           
     intx CMSInitiatingPermOccupancyFraction        = -1              {product}           
     bool CMSPermGenPrecleaningEnabled              = true            {product}           
     intx CMSTriggerPermRatio                       = 80              {product}           
    uintx MaxPermHeapExpansion                      = 5439488         {product}           
    uintx MaxPermSize                               = 85983232        {pd product}        
    uintx MinPermHeapExpansion                      = 327680          {product}           
    uintx PermGenPadding                            = 3               {product}           
    uintx PermMarkSweepDeadRatio                    = 5               {product}           
    uintx PermSize                                  = 21757952        {pd product}        
java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)

Java 8の

    uintx MaxMetaspaceSize                          = 18446744073709547520{product}

Java 7の差がスゴイ…。

    uintx MaxPermSize                               = 85983232        {pd product}

というわけで、うちのsbtの起動スクリプトはこんな感じにしました。

#!/bin/sh
java -Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxMetaspaceSize=384M -jar `dirname $0`/sbt-launch.jar "$@"