Ответ 1
Концептуально программисту вы можете утверждать, что "Постоянное поколение" в значительной степени бессмысленно. Если вам нужно загрузить класс или другие "постоянные" данные, и осталось место памяти, то в принципе вы можете просто загрузить его где-нибудь и не заботиться о том, чтобы вызвать совокупность этих элементов "поколение" вообще.
Однако, скорее всего, это логическое обоснование:
- потенциально может быть полезно (например, с точки зрения кеш-процессора) от того, что все метаданные кода/класса находятся рядом друг с другом в пространстве памяти, и чтобы гарантировать это, проще выделить фиксированные области (области);
- аналогично, пространство памяти, в котором хранятся метаданные кода/класса, потенциально имеет определенные "специальные" свойства (в частности, вы не хотите, чтобы он выгружался на диск, если вы можете ему помочь), и система, возможно, не сможет задавать такие свойства в памяти очень гранулированным образом, так что более практично иметь все "специальные" объекты в одном (или небольшом числе) смежном блоке или пространстве памяти;
- с постоянными объектами вместе помогает избежать фрагментации оставшегося пространства памяти, и снова самый практичный способ сделать это состоит в том, чтобы выделить один непрерывный блок памяти фиксированного размера с самого начала.
Так как я вижу вещи, в большинстве случаев причина выделения постоянного "поколения" действительно для практических целей внедрения, а не потому, что программист действительно очень страшен.
С другой стороны, для программиста ситуация обычно не страшная: требуемое количество постоянного поколения обычно предсказуемо, так что вы должны иметь возможность выделять требуемую сумму с достойной свободой действий. Поэтому, если вы обнаружите, что неожиданно превысили выделение, это может быть сигналом о том, что "что-то серьезное неправильно".
N.B. Вероятно, некоторые из проблем, с которыми первоначально был спроектирован PermGen, не являются такими большими проблемами для современных 64-разрядных процессоров с более крупными кэшами процессора. Если он удаляется в будущих версиях Java, это, скорее всего, признак того, что дизайнеры JVM считают, что он "выполнил свою задачу".