kagamihogeの日記

kagamihogeの日記です。

JEP 214: Remove GC Combinations Deprecated in JDK 8 をテキトーに訳した

http://openjdk.java.net/jeps/214をテキトーに訳した。

JEP 173: Retire Some Rarely-Used GC Combinationsをテキトーに訳した - kagamihogeの日記の続き的な。8で非推奨にしたので9では削除するよ~といった感じ。

JEP 214: Remove GC Combinations Deprecated in JDK 8

Owner    Bengt Rutisson
Created 2014/05/27 14:22
Updated 2014/10/17 08:17
Type    Feature
Status  Proposed to Target
Component   hotspot / gc
Scope   JDK
Discussion  hotspot dash gc dash dev at openjdk dot java dot net
Effort  S
Duration    S
Priority    2
Reviewed by Jon Masamitsu, Mikael Vidstedt
Endorsed by Mikael Vidstedt
Release 9
Issue   8044022

Summary

JEP 173を基にJDK 8で既に非推奨となったGCの組み合わせを削除します。

Non-Goals

このJEPでは、削除されたGCの組み合わせの代わりとなる実装の提供は行いません。削除されないほとんどのコレクターは削除されたGCの組み合わせと同等もしくれはそれ以上の性能です。削除されるGCと同等の機能を持つようにGCを機能拡張することも行いません。パフォーマンス要求を満たすためのGCのチューニングだけは考慮されます。

Success Metrics

  • 該当JVMオプションに対して非推奨メッセージが出力されないこと。JVMはメッセージの代わりに未知のフラグと見なす。
  • ParNew + SerialOldからParallelScavenge + SerialOld変更時のパフォーマンス変化が妥当なベンチマークによって受け入れられること*1

Motivation

JEP 173にあるように、既存のすべてのGCの組み合わせをメンテナンスし続けるのに多大なコストが発生しています。非推奨となったGCの組み合わせを削除することはHotSpot GCのコードを単純化でき、それによって多数のバグを削減し、他のGCの組み合わせの開発の高速化が可能になります。

Description

JEP 173で非推奨にされたGCの組み合わせのフラグと同様に、CMS foreground collectorのフラグ(JDK-8027876の一環として非推奨にされた)が、コードベースから削除される予定です。つまり、警告メッセージが表示されることすらなくなり、JVMはもしフラグが使用された場合には起動しません*2

フラグが一度削除されると、現状では無効となっているコードはGCコードベースから削除される予定です。この作業は広範囲に渡るのでコードベースの単純化が可能になります。こうした単純化は個別の変更に応じて分割が可能です。

以下は動作停止予定のフラグとフラグの組み合わせの詳細な要約です。

DefNew + CMS       : -XX:-UseParNewGC -XX:+UseConcMarkSweepGC
ParNew + SerialOld : -XX:+UseParNewGC
ParNew + iCMS      : -Xincgc
ParNew + iCMS      : -XX:+CMSIncrementalMode -XX:+UseConcMarkSweepGC
DefNew + iCMS      : -XX:+CMSIncrementalMode -XX:+UseConcMarkSweepGC -XX:-UseParNewGC
CMS foreground     : -XX:+UseCMSCompactAtFullCollection
CMS foreground     : -XX:+CMSFullGCsBeforeCompaction
CMS foreground     : -XX:+UseCMSCollectionPassing

このJEPでのParNew + SerialOldに対する作業には、ParNew + SerialOldとParallelScavenge + SerialOldとのパフォーマンス比較テストも含まれます。その結果はParNew + SerialOldからParallelScavenge + SerialOldへ変更するための改善提案の根拠となる予定です。

Alternatives

コードの非推奨オプションのすべてもしくは一部を残したままにする。そうした場合、GCコードの貴重なクリーンナップ機会を逃し、コードベースの新規開発を遅らせることになると思われます。

Testing

現在のテストは対象オプションが警告メッセージを出力することを検証します。このテストを、対象のオプションは未知であるとのメッセージを期待値とするように、修正する必要があります。

Risks and Assumptions

削除される予定のフラグのいずれかを使用しているユーザはJVM起動のコマンドラインを変更する必要があります。JDK 8からJDK 9へ移行しようとしているユーザの場合、警告メッセージが既に表示されているので、変更は突然のものではありません。想定では、ほとんどのユーザは削除されるフラグからモダンなGCにチューニングすることで利益を得られる筈です。

Dependences

本JEPの作業はJEP 173: Retire Some Rarely-Used GC Combinationsに依存しています。リンク先のJEPはJDK 8で実装済みであり、よって、現時点で未実装の依存関係はありません。

*1:is well understood for a reasonable set of benchmarks.が原文。上手く訳せた自身が無い。well understoodは十分よく理解される、的な意味で、その後に『妥当なベンチマークによって~』とあるので、まぁこんな感じに意味やろ、と妥協した

*2:the JVM will, instead, not start if these flags are used.が原文。JVM will ~ not startだから、起動もしなくなるよ、って訳でいいんだよね?