抽象類和接口在JVM中的存儲方面有什麼區別?更準確地說,JVM將接口存儲到其內存中的位置?抽象類和接口在JVM中的存儲方式有什麼區別
11
A
回答
7
警告:正如@assylias所述,此機制特定於Oracle HotSpot JVM。
Java8
之前所有的元信息都存儲在PermGen的,對於抽象類和接口。元信息僅包括特定於類的信息(它具有哪些字段,什麼是父類等)。
接口只能有public static final
字段,所以這個字段元信息存儲在PermGen中。
抽象類可以同時具有靜態和非靜態字段。然而,在元信息方面沒有區別,所以它們都存儲在PermGen中。另一方面,真實對象實例存儲在Heap中的靜態和非靜態字段。
參見例如約calendar
和myDate
存儲在PermGen的和真實對象實例被存儲在堆
public class MyClass {
public static final Calendar calendar = Calendar.getInstance();
private Date myDate = new Date();
}
字段信息。
Java8 PermGen被移動到堆空間中,在所謂的Metaspace中,所以您不會再看到java.lang.OutOfMemoryError: PermGen space
。然而,元信息和對象分配內存之間的概念分離仍然存在。
也審查@AlexTaylor規格報價。
6
method area的(邏輯堆的一部分)存儲關於在JVM中的類和接口大量的信息:
...存儲每個類結構,如運行時的常量池,場 和方法數據,以及方法和構造函數的代碼,包括 用於類和實例初始化的特殊方法(§2.9) 和接口初始化。
但是:
該規範並不強制方法區或 用於管理編譯的代碼策略的位置。
這意味着特定的JVM可以隨意存儲它們,無論它在哪裏。
相關問題
- 1. 抽象類和接口之間有什麼區別?
- 2. 抽象類和Mixin有什麼區別?
- 3. 接口和抽象方法的區別
- 4. 接口中的公共方法和抽象方法有什麼區別?
- 5. 繼承時抽象類和非抽象類有什麼區別
- 6. 接口類和抽象類有什麼區別和相似之處?
- 7. 爲什麼在接口中有抽象類和抽象變量/方法?
- 8. 指定抽象或不接口方法的區別是什麼?
- 9. 抽象和封裝有什麼區別?
- 10. 抽象和虛擬有什麼區別?
- 11. 爲什麼C#中存在抽象類和接口?
- 12. C#中的抽象類和接口類有什麼不同?
- 13. 抽象類中的方法的外部抽象和局部抽象之間有什麼區別?
- 14. 正常的接口類和只有抽象方法的抽象類是否有區別?
- 15. java中的接口和抽象接口的區別
- 16. 抽象類和靜態類之間有什麼區別?
- 17. Objective-c中的類和類接口有什麼區別?
- 18. 抽象類的抽象方法與java中接口的抽象方法的區別
- 19. 在Typescript中,類型和接口有什麼區別?
- 20. 在ASP.NET Core中使用存儲庫模式中的接口和抽象類
- 21. 抽象類和繼承之間有什麼區別?
- 22. 界面和抽象類有什麼區別?
- 23. 繼承和抽象類有什麼區別?
- 24. 在方法和類中使用泛型和接口有什麼區別
- 25. 抽象類和接口之間的技術區別
- 26. 抽象類和接口之間的區別?
- 27. IComparable和IEquatable接口有什麼區別?
- 28. 抽象與外觀有什麼區別?
- 29. DVM和JVM有什麼區別?
- 30. TypeScript中的「聲明類」和「接口」有什麼區別
堆,因爲接口只存在於類中的實現,它們在堆上。 – Hiru
這是純粹的信息還是你想達到某種目的? –
這取決於JVM,因爲JVM規範沒有說明應該如何組織內存...... – assylias