Является ли perm gen частью кучи?

#java #jvm #heap-memory

#java #jvm #куча-память

Вопрос:

Я начал читать о Java, jvm и так далее. Но когда дело доходит до памяти perm gen, я продолжаю получать разные ответы. Я действительно не понимаю и все больше и больше запутываюсь, потому что есть много разных объяснений. Итак, является ли perm gen частью кучи или нет?

Ответ №1:

Прежде всего, современные JVM не имеют PermGen.

PermGen был полностью удален в Java 8. Так что действительно мало смысла изучать это. Все версии Java до Java 8 являются устаревшими, и вы должны были перенести свой код давным-давно. И если у вас возникли проблемы с PermGen в устаревшем приложении на JVM до Java 8, это еще одна причина для его переноса 1.

(Java 7 и более ранние версии) PermGen описывается разными людьми / источниками как либо:

  • отдельная куча или
  • отдельная область «кучи».

Оба эти описания верны, в зависимости от вашей точки зрения. Факты, которые не подлежат обсуждению, следующие:

  • Размер кучи PermGen (или области) был определен отдельно от остальной части «обычной» кучи. Таким образом, существовал риск исчерпания пространства PermGen, даже если было доступно обычное пространство кучи.
  • PermGen был собран как мусор… с одним или двумя исключениями. Дело в том, что это был мусор, собираемый нечасто, исходя из предположения, что в PermGen будет минимальный мусор для фактического сбора.

PermGen использовался для метаданных класса и (до Java 7) для пула строк, используемого для строковых объектов, которые соответствовали строковым константам времени компиляции (например, литералам). В Java 7 пул строк был перемещен в обычную кучу.


1 — ОК. Иногда обновление невозможно; например, из-за устаревшего оборудования или клиентов, которые отказываются делать разумные вещи. Но в этих случаях вам следует избегать разработки нового кода, который может привести к новым проблемам PermGen. И вам следует избегать методов разработки / тестирования / развертывания (например, горячей загрузки), которые могут привести к утечкам PermGen.