官术网_书友最值得收藏!

3.1 對象與類

HotSpot VM使用oop描述對象,使用klass描述類,這種方式被稱為對象類二分模型。理解對象類二分模型最好的方法是回歸到編程語言本身來看。HotSpot VM是用C++編寫的,C++的類是一個強大的抽象工具,HotSpot VM需要借助這個強大的工具,對Java各個方面做一個抽象。換句話說,用一個C++類描述一個Java語言組件。

雖然動機簡單,但是隨意將組件抽象成C++的類勢必會造成混亂,因此HotSpot VM基本遵循一個規則,如圖3-1所示。

圖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。

主站蜘蛛池模板: 伽师县| 阿巴嘎旗| 全南县| 隆回县| 侯马市| 新乡市| 苗栗县| 大庆市| 龙川县| 梁平县| 阜新| 广河县| 淳化县| 怀柔区| 偏关县| 离岛区| 宜宾县| 澄城县| 多伦县| 高青县| 偃师市| 东阿县| 霞浦县| 望都县| 葵青区| 大邑县| 诸暨市| 芜湖县| 洛浦县| 瓦房店市| 蓬莱市| 紫阳县| 巨野县| 独山县| 清徐县| 鄱阳县| 洪湖市| 客服| 秭归县| 会东县| 昌黎县|