- 深入解析Java虛擬機HotSpot
- 楊易
- 528字
- 2021-01-07 11:18:28
3.1 對象與類
HotSpot VM使用oop描述對象,使用klass描述類,這種方式被稱為對象類二分模型。理解對象類二分模型最好的方法是回歸到編程語言本身來看。HotSpot VM是用C++編寫的,C++的類是一個強大的抽象工具,HotSpot VM需要借助這個強大的工具,對Java各個方面做一個抽象。換句話說,用一個C++類描述一個Java語言組件。
雖然動機簡單,但是隨意將組件抽象成C++的類勢必會造成混亂,因此HotSpot VM基本遵循一個規則,如圖3-1所示。
Java層面的對象會被抽象成C++的一個oop類:普通對象(new Foo)是instanceOop,普通數組(new int[])是typeArrayOop,對象數組(new Bar[])是objArrayOop。這些類都繼承自oop類,如果查看HotSpot VM源碼會發現沒有oop、instanceOop、objArrayOop等類,只有oopDesc、instanceOopDesc、objArrayOopDesc,其實后兩者是一回事,instanceOop只是instanceOopDesc指針的別名(typedef)。Java層面的類、接口、枚舉會被抽象成C++的klass類。對象的類(Foo.class)是instanceKlass,對象數組的類(Bar[].class)是objArrayKlass,普通數組的類(int[].class)是typeArrayKlass。
除此之外,還有不滿足規則的特例。Java對象在虛擬機表示中除了字段外還有個對象頭,里面有一個字段記錄了對象的GC年齡、hash值等信息,這個字段被命名為markOop。另外,java.lang.ref.Reference及其子類不是用InstanceKlass描述而是用InstanceRefKlass描述,它們會被GC特殊對待。與之類似,java.lang.ClassLoader用InstanceClassLoaderKlass描述,java.lang.Class用InstanceMirrorKlass描述。以上便是對象和類的相關內容,它們的源碼位于hotspot/share/oops,本章剩下的部分將首先討論表示對象的oop,然后討論表示類的klass。
- JavaScript從入門到精通(微視頻精編版)
- TypeScript Essentials
- Mastering ServiceStack
- Flask Web開發入門、進階與實戰
- Learning Firefox OS Application Development
- Mastering Python High Performance
- HTML5+CSS3網站設計教程
- Python貝葉斯分析(第2版)
- 深入理解Android:Wi-Fi、NFC和GPS卷
- 輕松上手2D游戲開發:Unity入門
- 快速入門與進階:Creo 4·0全實例精講
- Web性能實戰
- FFmpeg開發實戰:從零基礎到短視頻上線
- Learning Python Data Visualization
- Python GUI Programming Cookbook(Second Edition)