Пермское пространство против кучного пространства

Во-первых, в чем разница между пермским пространством и пространством кучи (что и как JVM выбирает использовать каждое пространство памяти)?

Во-вторых, но самое главное, какое отношение было бы рекомендовано для стандартного Java-приложения типа MVC?

Ответ 1

куча хранит все объекты, созданные вашей программой Java. Содержимое кучи контролируется сборщиком мусора, который освобождает память из кучи при прекращении использования объекта (т.е. Когда больше нет ссылок на объект.

Это отличается от stack, в котором хранятся примитивные типы, такие как int и символы, и обычно это локальные переменные и возвращаемые значения функции. Это не сбор мусора.

perm space относится к специальной части кучи. См. Этот ответ SO для объяснения: Что такое perm space?

Ответ 2

Лично я не считаю PermGen особой частью кучи.

Я бы предпочел думать о куче как области памяти, предназначенной для хранения экземпляров объекта, а PermGen - как область, предназначенная для хранения определений классов. В результате жизненный цикл кучи привязан к приложению, а жизненный цикл PermGen привязан к JVM.

Один из лучших примеров того, почему приложение и его JVM могут иметь различный жизненный цикл в контейнере Java EE. На сервере приложений приложения могут развертываться и развертываться без перезапуска сервера. Во время undeployment (или перераспределения) легко освободить все экземпляры объекта, т.е. пустое пространство, но довольно сложно удалить все классы, загруженные этим приложением из PermGen, потому что некоторые из классов по-прежнему могут ссылаться на JVM.

Одним из таких случаев является Утечка драйверов. Когда приложение развертывается, драйвер JDBC загружается и регистрируется с помощью DriverManager. Когда это приложение не развернуто, DriverManager живет и содержит ссылку на драйвер, его оригинальный загрузчик классов и все загрузчики этого класса. В результате создается утечка памяти в PermGen, но это не ошибка управления памятью приложения.

Правда, JVM, как JRocket, вообще не имеет PermGen, все хранится в куче. Только в таком контексте вы можете назвать PermGen "специальной частью" кучи. Даже тогда мы должны по-прежнему рассматривать PermGen и кучу по-разному, поскольку они имеют совершенно другую цель, и у них очень разные типы утечек памяти.

Обновление. В Oracle JDK 8 PermGen заменяется на и теперь официально является частью кучи. Нам больше не нужно настраивать PermGen.

Ответ 3

Вы не можете указывать имена выделенной памяти в куче.

Это означает, что int x (его имя) выделяется в стеке. Вы можете достичь указателя по его имени, поэтому указатель находится в стеке. Вы не можете достичь объекта по его имени, потому что у него нет имени. Accees к (безымянному) объекту должен быть по указателю.