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

этот вопрос уже есть ответ здесь:

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

2 ответов


предупреждение: как упоминалось @assylias, эта механика специфична для Oracle HotSpot JVM.

До Java8

вся метаинформация хранится в PermGen, как для абстрактных классов, так и для интерфейсов. Метаинформация включает только информацию о классе (какие поля у него есть, что является родительским и т. д.).

интерфейс может иметь только public static final поля, поэтому эта метаинформация поля хранится в PermGen.

абстрактный класс может иметь как статические, так и нестатические поля. Тем не менее, нет никакой разницы с точки зрения метаинформации, поэтому все это хранится в PermGen тоже. С другой стороны, экземпляры реальных объектов хранятся в куче как для статических, так и для нестатических полей.

пример

public class MyClass {
   public static final Calendar calendar = Calendar.getInstance();
   private Date myDate = new Date();
}

поле информации о calendar и myDate хранится в PermGen, а реальные экземпляры объектов хранятся в куче.

на Java8 PermGen был перемещен внутри пространства кучи, в так называемом Metaspace, так что вы не увидите


на зона метод (логически часть кучи) хранит много информации о классах и интерфейсах в JVM:

...хранит структуры для каждого класса, такие как пул констант времени выполнения, поле и данные метода, и код для методов и конструкторов, включая специальные методы (§2.9), используемые в инициализации класса и экземпляра и инициализация интерфейса.

:

этот спецификация не предписывает местоположение области метода или политики, используемые для управления скомпилированным кодом.

Что означает, что конкретный JVM может хранить их где угодно.