Jaka jest różnica między klasą abstrakcyjną a interfejsem w zakresie ich przechowywania w JVM. Bardziej precyzyjnie, gdzie JVM przechowuje interfejsy w swojej pamięci?Czym różnią się klasy abstrakcyjne od interfejsu pod względem ich przechowywania w JVM
Odpowiedz
Ostrzeżenie: Jak wspomniano przez @assylias, ta mechanika jest specyficzna dla Oracle HotSpot JVM.
Przed Java8
Wszystko meta informacje są przechowywane w PermGen dla obu klas abstrakcyjnych i interfejsów. Informacje meta zawierają tylko informacje specyficzne dla klasy (jakie pola mają, co jest rodzicem itp.).
Interfejs może mieć tylko pola public static final
, więc meta informacja tego pola jest przechowywana w PermGen.
Klasa abstrakcyjna może mieć zarówno pola statyczne, jak i niestatyczne. Jednak nie ma różnicy w zakresie meta informacji, więc wszystko to jest również przechowywane w PermGen. Z drugiej strony, rzeczywiste instancje obiektów są przechowywane w Heap dla pól statycznych i niestatycznych.
patrz przykład
public class MyClass {
public static final Calendar calendar = Calendar.getInstance();
private Date myDate = new Date();
}
Pole informacyjne o calendar
i myDate
jest przechowywany w PermGen i przypadki rzeczywistego obiektu są przechowywane w stercie.
W Java8 PermGen został przeniesiony wewnątrz przestrzeni kupie, w tzw Metaspace, więc nie będzie widać java.lang.OutOfMemoryError: PermGen space
więcej. Jednak wciąż istnieje konceptualna separacja między meta-informacjami a pamięcią do przydzielania obiektów.
Zobacz również specyfikację specyfikacji @AlexTaylor.
method area (logicznie część hałdy) przechowuje wiele informacji na temat klas i interfejsów w JVM:
... Konstrukcje sklepy per-klasy takie jak run-time stała basen, pole i dane metody oraz kod metod i konstruktorów, w tym specjalne metody (§ 2.2) używane podczas inicjalizacji klasy i instancji oraz inicjalizacji interfejsu.
Jednakże:
Ta specyfikacja nie określa lokalizację obszaru metoda lub polityki wykorzystywanych do zarządzania kod skompilowany.
Co oznacza, że konkretna maszyna JVM może je przechowywać w dowolnym miejscu.
Sterty, ponieważ interfejsy istnieją tylko jako implementacje w klasach i są na stercie. – Hiru
Czy to czysto informacyjne czy próbujesz coś osiągnąć? –
To zależy od JVM, ponieważ specyfikacja JVM nie mówi, jak pamięć powinna być zorganizowana ... – assylias