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.
- 1. Czym różnią się abstrakcje od wirtualnych?
- 2. Czym różnią się HashMap od HashMultimap
- 3. Czym różnią się Surfaceview od TextureView?
- 4. Czym różnią się układy w stosy od stacked coroutines?
- 5. Czym różnią się te funkcje?
- 6. Czym różnią się te warianty?
- 7. Czym różni się adapter od interfejsu sieciowego?
- 8. Czym różnią się odniesienia do projektu od zależności projektu?
- 9. Czym różni się ArrayListMultimap od LinkedListMultimap?
- 10. Czym różnią się NSURLConnection od żądania ASI-HTTP?
- 11. Czym różnią się ReSharper C++ i Visual Assist od
- 12. Czym różnią się właściwości hosta od właściwości polimeru?
- 13. Czym różnią się 127.0.0.1, 0.0.0.0 i localhost?
- 14. Czym różnią się style.left i element.offsetLeft
- 15. Czym różnią się parametry memory_order_seq_cst i memory_order_acq_rel?
- 16. Czym różnią się bcprov i bcprov-ext?
- 17. Czym różnią się os.getuid() i os.geteuid()?
- 18. Czym różnią się odniesienia do obiektów w java?
- 19. czym jest ścieżka //, czym różni się od/
- 20. Klasy abstrakcyjne w kontenerach standardowych
- 21. Czym różnią się funkcjaFunction i CoGroupFunction w Apache Flink?
- 22. Czym różnią się narzędzia: tekst i android: tekst w Androidzie
- 23. Czym różnią się embedsMany i hasMany w pętli zwrotnej Strongloop
- 24. Czym różnią się graficzne bazy danych i obiektowe bazy danych?
- 25. Zmienione względem zmiennych zmiennych pod względem przechwytywania
- 26. Czym różnią się Adobe PhoneGap i Apache Cordova?
- 27. Czym różnią się pliki dziennika MongoDB i oplog?
- 28. Czym różnią się niektóre narzędzia "Android Development/SDK"?
- 29. JAXB i klasy abstrakcyjne
- 30. Czym różnią się te linie IL? (Zespół wyjściowy Fody)
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