Javaのチューニングフラグまとめ(1.8.0_92時点）

2017年10月25　-XX:MetaspaceSizeの説明が誤っていたため修正しました。

Javaのチューニングフラグです。
1.8時点でまとめました。

**チューニングに関連していると思われるフラグのみ抽出**

| オプション | 意味 |
|:-------------|:---|
|-Xms|ヒープメモリの初期サイズを指定する|
|-Xmx|ヒープメモリの最大サイズを指定する|
|-XX:NewRatio|young領域に対するold領域のサイズ比を指定する|
|-XX:NewSize|young領域の初期サイズを指定する|
|-XX:MaxNewSize|young領域の最大サイズを指定する|
|-Xmn|-XX:NewSizeと同様|
|-XX:PermSize|permanent領域の初期サイズを指定する（java7以下で有効）　|
|-XX:MaxPermSize|領域の最大サイズを指定する（java7以下で有効）　|
|-XX:MetaspaceSize|メタスペースのGCを実施する目安サイズ指定（java8以降で有効）|
|-XX:MaxMetaspaceSize|メタスペースの最大サイズを指定する（java8以降で有効）|
|-XX:parallelGCThreads|ガベージコレクタが動くスレッド数を指定|
|-verbose:gc|ガベージコレクションの詳細情報をログに出力する|
|-Xloggc:パス|ガベージコレクションのログをファイルにリダイレクトする|
|-XX:+PrintGC|-verbose:gcと同様|
|-XX:+PrintGCDetails|ガベージコレクションの詳細情報をログに出力する|
|-XX:+PrintGCTimeStamps|ガベージコレクションのログにjava起動時からの相対時間を出力する|
|-XX:+PrintGCDateStamps|ガベージコレクションのログに処理実施時の時刻を出力する|
|-XX:+PrintReferenceGC|ガベージコレクションの際に、弱い参照に対する処理を記録する|
|-XX:+UseGCLogFileRotation|ガベージコレクションの実行ログをローテションする|
|-XX:NumberOfGCLogFiles|ログローテーションが有効の場合保持するファイル数を指定|
|-XX:GCLogFileSize|ログローテーションの1ファイルサイズ|
|-XX:+UseAdaptiveSizePolicy|ヒープメモリ内の領域サイズを自動調整する|
|-XX:+PrintAdaptiveSizePolicy|ガベージコレクションのログ中に領域サイズ変更に関する情報を出力する|
|-XX:+PrintTenuringDistribution|ガベージコレクションのログ中で昇格する情報を出力する|
|-XX:+InitialSurvivorRatio|young領域の中で、survivor空間のためにあらかじめ確保する量を指定する|
|-XX:MinSurvivorRatio|young領域の中で、survivor空間について適応的に変更されるサイズを指定する|
|-XX:TargetSurvivorRatio|survivor領域中の空容量を指定する|
|-XX:InitialTenuringThreshold|JVMがオブジェクトを　survivor領域に保持しておく期間の初期値を、ガベージコレクションの回数として表現する|
|-XX:MaxTenuringThreshold |JVMがオブジェクトをsurvivor領域に保持しておく期間の最大値をガベージコレクションの回数として表現する|

**ヒープの設定例**
よくある設定例を記載します（あくまで例です）

```setevn.sh:sh
#!/bin/sh
JAVA_OPTS="-Xms=512M -Xmx=512M -XX:MaxMetaspaceSize=512M"
export JAVA_OPTS
```

ヒープの確保値・最大値を512MB、メタスペースの最大値を512MBとしています。
・JVMを起動する際512MB確保して、それ以上増やさない設定です。
　ヒープの確保値・最大値を同じ値にした意図は確保量を拡張する際のオーバーヘッドをなくすためです
・メタスペースの最大値を512MB確保して、それ以上増やさない設定です。
　メタスペースは確保値を設定できるオプションが見つからなかったため最大値のみ指定しています。あまりメタスペースが頻繁に増加するプログラムを作ることはないかもしれませんが、仕組み上無制限に拡張できてしまうので最大値を設定して定期的にメモリをFullGCで解放します。



（参考）
java8からpermanent領域が廃止されたが、同バージョンで関連フラグがあった場合どうなるか。

**設定**

```setevn.sh:sh
#!/bin/sh
JAVA_OPTS="-XX:PermSize=128M -Xms512M -Xmx512M"
export JAVA_OPTS
```

**起動**

```sh
$./startup.sh
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128M; support was removed in 8.0
04-Aug-2016 01:25:40.624 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version:        Apache Tomcat/8.5.4
・・・省略・・・

$ps aux |grep java
kusakai          1155   0.0  0.0  2441988    648 s000  R+    1:27AM   0:00.01 grep java
kusakai          1146   0.0  3.2  4421264 132964 s000  S     1:25AM   0:05.69 /Library/Java/JavaVirtualMachines/jdk1.8.0_92.jdk/Contents/Home/bin/java -Djava.util.logging.config.file=/make/apache-tomcat-8.5.4/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -XX:PermSize=128M -Xms512M -Xmx512M -Djdk.tls.ephemeralDHKeySize=2048 -classpath /make/apache-tomcat-8.5.4/bin/bootstrap.jar:/make/apache-tomcat-8.5.4/bin/tomcat-juli.jar -Dcatalina.base=/make/apache-tomcat-8.5.4 -Dcatalina.home=/make/apache-tomcat-8.5.4 -Djava.io.tmpdir=/make/apache-tomcat-8.5.4/temp org.apache.catalina.startup.Bootstrap start
```

記載した場合、無視しますというログが出て、起動しました。
![tc.png](https://qiita-image-store.s3.amazonaws.com/0/110457/d323bffd-f313-8f87-9ba3-ebafd54e0f6c.png)