JDK 1.5.0のUpdateバージョンで変わったところその1

Update6からMaxTenuringThresholdの値が31から15になっている

シリアルGCの発想して、New領域、Old領域、スキャベンジGCとフルGC、短命オブジェクトと長命オブジェクトというのがあります。
New領域は、オブジェクトがはじめに配置される領域です。Old領域は、New領域の後に配置される領域です。
スキャベンジGCは、New領域のオブジェクトを掃除し比較的に短期に掃除が終了します。フルGCはすべての領域のオブジェクトをチェックし掃除するので時間がかかるGCです。
短命オブジェクトは、生成されすぐに破棄されてるオブジェクトです。ローカル変数などがこれにあたります。長命オブジェクトは長期的に生きているオブジェクトです。たとえば起動から停止まで使われるオブジェクトが長命オブジェクトとなります。
New領域の一定の領域にオブジェクトが溜まるとスキャベンジGCが発生し不要なオブジェクトを清掃します。残ったオブジェクトは、New領域に留まるか、Old領域に移動するか判定することになります。
その判定方法として、オブジェクトがNew領域に配置されて、X回目(閾値)のスキャベンジGCが発生しても生きていたらOld領域に移動するという世代管理方式をとります。その閾値は、GCアルゴリズムによって1からMaxTenuringThresholdの値に動的に変更されます。
閾値の最大値は、-XX:MaxTenuringThresholdで指定できます。デフォルトは、31でしたがこれが15にUpdate6から変更されています。
ただし、MaxTenuringThresholdは、管理できる世代も指定できるわけではありません。管理できる世代もUpdate6から31から15に変更されており固定な値となっています。また、MaxTenuringThresholdが管理できる世代より大きいと指定した世代に達することができないので、閾値が世代より大きくなっていると*1Old領域に移動しなくなります。
ちなみにチューニングでは、New領域で短命オブジェクトが破棄され、Old領域に行かないようにチューニングすることになります。上記の閾値が高いほうがNew領域に長く居続けられる可能性が高くなりOld領域に移動しにくくなるので、閾値がMaxTenuringThresholdに近い値を維持することがチューニングの目標となります。
で何で31から15に変更されたかはわかりません。

*1:各世代に残っているオブジェクトの総和がDesired Survivor Size以下であると閾値は、MaxTenuringThresholdになるのですが、MaxTenuringThresholdが管理できる世代をより大きくなっていると、閾値が管理する世代より一つ大きな値に設定されます