Подтвердить что ты не робот

В чем разница между абстрактным классом и интерфейсом с точки зрения их хранения в JVM

В чем разница между абстрактным классом и интерфейсом с точки зрения их хранения в JVM. Точнее, где JVM хранит интерфейсы в своей памяти?

4b9b3361

Ответ 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 может хранить их везде, где это угодно.