#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.