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