2015-06-15 26 views
11

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

+0

Sterty, ponieważ interfejsy istnieją tylko jako implementacje w klasach i są na stercie. – Hiru

+1

Czy to czysto informacyjne czy próbujesz coś osiągnąć? –

+0

To zależy od JVM, ponieważ specyfikacja JVM nie mówi, jak pamięć powinna być zorganizowana ... – assylias

Odpowiedz

7

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.

+0

Jak komentuje, jest to zależne od JVM - na przykład to, co podajesz, nie może być poprawne dla hostpot/Java 8, ponieważ nie ma już Permgen w ogóle ... – assylias

+0

To jest nadal specyficzne dla JVM punktu dostępowego. – assylias

6

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.