В чем разница между абстрактным классом и интерфейсом с точки зрения их хранения в 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 может хранить их где угодно.