Java」カテゴリーアーカイブ

Java9ではCMS GCが非推奨らしい

はじめに、当方はJava初心者であります。(これを言っておかないと後で大変なことになるので……)

Java9ではCMS GC(Concurrent Mark Sweep Garbage Collector)が非推奨(Deprecate)になるらしいです。そもそもCMS GCは、「停止できないエンタープライズ・アプリケーション」に向いた、MajorGCにおけるSTW(Stop The World:アプリケーションの停止時間)が短いという特性のあるアルゴリズムです。一方で、コンパクション(HDDで言うところのデフラグみたいなもの)されないという側面もあり、結局はFullGCが選択されることもありました。つまるところ、GC手法としてどれを選択するかはトレードオフの話ではありますが、一般的にはCMS GCが選ばれてきたことと思います。

それが、Java9から非推奨となり、それ以降では廃止も視野に入れられているとのことです。Java9以上へのマイグレーションにより、CMS GCからG1GCに乗り換える場合、大規模かつ長期に亘る性能試験が必要になるでしょう……。正直、頭が痛くなるので、あまり考えたくありません。

そもそも廃止される理由は、G1GCがCMS GCの優位点である「STWの短さ」に追いつきつつあるからという正当な理由1と、CMS GCを廃止することでCMS GCに注いでいた開発体力を他GCに振り分けて開発を加速させるという不当な理由2があるようです。

Dropping support for CMS and then removing the CMS code, or at least more thoroughly segregating it, will reduce the maintenance burden of the GC code base and accelerate new development. The G1 garbage collector is intended, in the long term, to be a replacement for most uses of CMS.

Google翻訳:CMSのサポートを中止し、CMSコードを削除するか、少なくともそれをより完全に分離すると、GCコードベースの保守負担が軽減され、新しい開発が加速されます。 G1ガベージコレクタは、長期的には、CMSのほとんどの用途を置き換えるものです。

http://openjdk.java.net/jeps/291

文書の中では、こうも言及されています。

For some applications CMS is a very good fit and might always outperform G1.

Google翻訳:一部のアプリケーションでは、CMSは非常に適しており、常にG1を上回る可能性があります。

ならさ……。

Java8から導入されたMetaspaceで痛い目を見た身としては、二の舞になりそうな予感がめっちゃしています……。因みに、本件に言及した日本語の記事はググっても殆ど出てこないので、怖がっている人は殆ど居ないっぽいです。

インスタンス初期化子の存在意義が理解できました

Javaの機能として用意されているインスタンス初期化子とクラス初期化子について、クラス初期化子は用途がなんとなくわかった(他に代替がない機能)のですが、インスタンス初期化子はコンストラクタで良くないのかなあ、と思っていたのですが、無名クラスの定義の際に必要だということに気づきました。

確かに要るなぁと感心したのでメモしときます。

続きを読む