CLOVER🍀

That was when it all began.

Java 11のガベージ・コレクション・チューニングガイドを読む

Java 8以降になってAPIドキュメント以外をあまり見ていなかったのですが、いろんなドキュメントが見やすくなって
いるんだなぁと。

JDK 11ドキュメント - ホーム

で、こちらのドキュメントがちょっと気になりまして。

ガベージ・コレクションのチューニングの概要

f:id:Kazuhira:20201014000515p:plain

Java 8の頃に比べると、だいぶ差が。

Java Platform, Standard Edition HotSpot Virtual Machineガベージ・コレクション・チューニング・ガイド, リリース8

どうしてこのあたりを見ているかというと、Java 9以降でデフォルトになったG1GCですがどれくらいのヒープサイズ以上が
目安なのか、どこかに書いてあったかなぁということで探してみたと。

書いてありました。

最大10GBまたはそれ以上のヒープ・サイズ(Javaヒープの50%超がライブ・データで占められている)。

ガベージファースト・ガベージ・コレクタの概要

これ、Java 9の時点で書いてあったんですね。

ガベージファースト・ガベージ・コレクタ

Java 8の時点ではこうでした。

Javaヒープの50%超がライブ・データで占められている。

ガベージファースト・ガベージ・コレクタ

「最大10GBまたは〜」あたりが増えてますね。10GBですか…。

エルゴノミクスについて。

エルゴノミクス

使用可能なコレクタと、コレクタの選択について。

使用可能なコレクタ

G1GC(デフォルトのGC)。

ガベージファースト・ガベージ・コレクタ

Parallel GC

パラレル・コレクタ

ZGC(実験的な機能:低レイテンシが要求される、または巨大なヒープ(数TB)を使用するアプリケーションが対象)。

Zガベージ・コレクタ

CMS GCJava 9以降非推奨)。

コンカレント・マーク・スイープ(CMS)コレクタ

GCの切り替えだけ、軽く確認。

環境。

$ java --version
openjdk 11.0.8 2020-07-14
OpenJDK Runtime Environment (build 11.0.8+10-post-Ubuntu-0ubuntu120.04)
OpenJDK 64-Bit Server VM (build 11.0.8+10-post-Ubuntu-0ubuntu120.04, mixed mode, sharing)

切り替え方は、各GCのページを見るか、コレクタの選択ページを見ると良いでしょう。

コレクタの選択

デフォルトはG1GCです。

$ java -XX:+PrintFlagsFinal --version | grep G1GC
     bool UseG1GC                                  = true                                      {product} {ergonomic}

明示的に指定。

$ java -XX:+PrintFlagsFinal -XX:+UseG1GC --version | grep G1GC
     bool UseG1GC                                  = true                                      {product} {command line}

Parallel GC

$ java -XX:+PrintFlagsFinal -XX:+UseParallelGC --version | grep Parallel
     bool AllowParallelDefineClass                 = false                                     {product} {default}
     bool CMSParallelInitialMarkEnabled            = true                                      {product} {default}
     bool CMSParallelRemarkEnabled                 = true                                      {product} {default}
     bool CMSParallelSurvivorRemarkEnabled         = true                                      {product} {default}
    uintx ParallelGCBufferWastePct                 = 10                                        {product} {default}
     uint ParallelGCThreads                        = 8                                         {product} {default}
   size_t ParallelOldDeadWoodLimiterMean           = 50                                        {product} {default}
   size_t ParallelOldDeadWoodLimiterStdDev         = 80                                        {product} {default}
     bool ParallelRefProcBalancingEnabled          = true                                      {product} {default}
     bool ParallelRefProcEnabled                   = false                                     {product} {default}
   size_t PreTouchParallelChunkSize                = 1073741824                                {product} {default}
     bool UseParallelGC                            = true                                      {product} {command line}
     bool UseParallelOldGC                         = true                                      {product} {default}

ZGC。

$ java -XX:+PrintFlagsFinal -XX:+UnlockExperimentalVMOptions -XX:+UseZGC --version | grep ZGC
     bool UseZGC                                   = true                                 {experimental} {command line}

CMS GC

$ java -XX:+PrintFlagsFinal -XX:+UseConcMarkSweepGC --version | grep ConcMarkSweep
OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
     bool UseConcMarkSweepGC                       = true                                      {product} {command line}

いつも以上に、ただのメモです。

ちゃんと読もう…。