В чем разница между абстрактным классом и интерфейсом с точки зрения их хранения в JVM. Точнее, где JVM хранит интерфейсы в своей памяти?
В чем разница между абстрактным классом и интерфейсом с точки зрения их хранения в JVM
Ответ 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.
Ответ 2
Область (логически часть кучи) хранит много информации о классах и интерфейсах в JVM:
... хранит структуры для каждого класса, такие как пул констант времени выполнения, поле и данные метода, а также код методов и конструкторов, включая специальные методы (§2.9), используемые в инициализации класса и экземпляра и инициализация интерфейса.
Однако:
В этой спецификации не указано местоположение области метода или политики, используемые для управления скомпилированным кодом.
Это означает, что конкретная JVM может хранить их везде, где это угодно.