Ответ 1
Предупреждение. Как уже упоминалось @assylias, эта механика специфична для JVM Oracle HotSpot.
До Java8
Вся метаинформация хранится в PermGen как для абстрактных классов, так и для интерфейсов. Метаинформация включает только информацию о конкретном классе (какие у него поля, что такое родительский элемент и т.д.).
Интерфейс может иметь только поля public static final
, поэтому эта метаинформация поля сохраняется в PermGen.
Абстрактный класс может иметь как статические, так и нестатические поля. Тем не менее, нет никакой разницы в мета-информации, поэтому все они хранятся в Перменгене. С другой стороны, экземпляры реальных объектов хранятся в Heap как для статических, так и для нестатических полей.
См. пример
public class MyClass {
public static final Calendar calendar = Calendar.getInstance();
private Date myDate = new Date();
}
Информация о поле в calendar
и myDate
хранится в PermGen, а экземпляры реальных объектов хранятся в куче.
В Java8 PermGen был перемещен внутри пространства кучи в так называемом метапроцессе, так что вы больше не увидите java.lang.OutOfMemoryError: PermGen space
. Однако концептуальное разделение между метаинформацией и памятью размещения объектов все еще присутствует.
Также просмотрите спецификацию спецификации @AlexTaylor.