概念的には、プログラマーにとって、「永続的な世代」はほとんど無意味であると主張することができます。クラスまたはその他の「永続的な」データをロードする必要があり、メモリスペースが残っている場合は、原則として、どこかにロードするだけで、これらのアイテムの集合体を「世代」と呼ぶ必要はありません。
ただし、理論的根拠はおそらくそれ以上です。
- すべてのコード/クラスメタデータをメモリ空間に近接させることで(プロセッサキャッシュの観点からなど)潜在的にメリットがあり、これを保証するために、固定サイズの領域を簡単に割り当てることができます。
- 同様に、コード/クラスメタデータが格納されているメモリスペースには、特定の「特別な」プロパティがあり(特に、支援できる場合はディスクにページアウトされたくない)、システムがそのようなプロパティを設定できない場合があります。非常にきめ細かい方法でメモリ上に配置するため、すべての「特別な」オブジェクトを1つ(または少数)の連続したブロックまたはメモリ空間にまとめることがより実用的です。
- 永続的なオブジェクトをすべて一緒に持つことは、残りのメモリスペースの断片化を回避するのに役立ちます。これを行う最も実用的な方法は、最初から固定サイズのメモリの1つの連続したブロックを割り当てることです。
ですから、私が見ているように、ほとんどの場合、永続的な「世代」を割り当てる理由は、プログラマーが本当にひどく気にかけているという理由よりも、実際の実装上の理由によるものです。
一方、プログラマーにとっても状況は通常ひどいものではありません。必要な永続的な生成の量は通常予測可能であるため、必要な量を適切な余裕を持って割り当てることができるはずです。したがって、予期せず割り当てを超えていることに気付いた場合、これは「重大な問題が発生している」ことを示している可能性があります。
注意:PermGenが最初に解決するように設計された問題のいくつかは、より大きなプロセッサキャッシュを備えた最新の64ビットプロセッサではそれほど大きな問題ではない可能性があります。Javaの将来のリリースで削除された場合、これは、JVM設計者が「目的を果たした」と感じていることを示している可能性があります。