サバイバーの配給は非常に重要です。10000の場合、サバイバースペースはエデンの10000分の1のサイズであるとJVMに伝えます。
ドキュメントから:
サバイバースペースが小さすぎる場合、コレクションのコピーはテニュア世代に直接オーバーフローします。サバイバースペースが大きすぎると、無駄に空になります。各ガベージコレクションで、仮想マシンは、オブジェクトが保持される前にオブジェクトをコピーできるしきい値を選択します。このしきい値は、生存者を半分いっぱいに保つために選択されます。コマンドラインオプション-XX:+ PrintTenuringDistributionを使用して、このしきい値と新世代のオブジェクトの経過時間を表示できます。また、アプリケーションの寿命分布を観察するのにも役立ちます。
したがって、明らかにサバイバースペースの比率が非常に低いため、オブジェクトはテニュア世代に直接保存されます。
保有世代がいっぱいになると、主要なコレクションが発生しました。そのため、ログに表示[Full GC...]
されます。
若い世代をもっと大きく使いたいなら:
-XX:NewRatio=1
これは、エデンとサバイバースペースの合計サイズが合計ヒープサイズの半分になることを意味します。(私はあなたがより大きな若い世代を持つことはできないと思います)
また、-XX:NewSize
すでに設定している場合は設定する必要はありませんが、1.4以降も同じです。そして、私はあなたが上から若い世代をバインドしたくないと思います、デフォルト値は無制限です。ただし、若い世代のサイズを最大ヒープサイズと同じ値に設定すると、古い世代用のスペースが確保されないため、JVMによって世代のサイズが変更されると思います。-Xmn
-Xmn
-XX:MaxNewSize
結論として、割り当てがテニュア世代に直接発生する場合もあります。(オブジェクトが古い世代に直接割り当てられることはありますか?)
- 若い世代で割り当てが失敗し、オブジェクトがオブジェクトへの参照を含まない大きな配列である場合は、古い世代に直接割り当てることができます。一部の選択された例では、この戦略は、古い世代から割り当てることによって若い世代のコレクションを回避することを目的としていました。しきい値のサイズは64kワードです。