JVM原始碼實戰 - OOP-Klass模型
1 OOP-Klass(Ordinary Object Pointer)模型
OOP-Klass模型用來描述class的屬性和行為 設計為OOP和Klass兩部分是因為不希望每個物件都有一個C ++ vtbl指標, 因此,普通的oops沒有任何虛擬功能。 相反,他們將所有“虛擬”函式轉發到它們的klass,它具有vtbl並根據物件的實際型別執行C ++排程。
1.1 OOP
oopDesc是物件類的最高父類。 {name}Desc類描述了Java物件的格式,可從C++訪問這些欄位
- 路徑:
/hotspot/share/oops/oop.hpp
完整的類層次結構,請閱讀src/hotspot/share/oops/oopsHierarchy.hpp
-
OOP體系
1.2 Klass
-
Klass體系Klass物件提供
-
語言級別的類物件(方法字典等)
-
為物件提供虛擬機器排程行為
class Klass : public Metadata {
friend class VMStructs;
friend class JVMCIVMStructs;
protected:
// 如果新增指向任何後設資料物件的新欄位,則必須將此欄位新增到Klass :: metaspace_pointers_do()
// 注意:在klass結構的起始處將常用欄位放在一起,以獲得更好的快取行為(雖然可能不會有太大的區別,但可以肯定不會造成傷害)
enum { _primary_super_limit = 8 };
// The "layout helper" is a combined descriptor of object layout.
// For klasses which are neither instance nor array, the value is zero.
//
// For instances, layout helper is a positive number, the instance size.
// This size is already passed through align_object_size and scaled to bytes.
// The low order bit is set if instances of this class cannot be
// allocated using the fastpath.
//
// For arrays, layout helper is a negative number, containing four
// distinct bytes, as follows:
// MSB:[tag, hsz, ebt, log2(esz)]:LSB
// where:
// tag is 0x80 if the elements are oops, 0xC0 if non-oops
// hsz is array header size in bytes (i.e., offset of first element)
// ebt is the BasicType of the elements
// esz is the element size in bytes
// This packed word is arranged so as to be quickly unpacked by the
// various fast paths that use the various subfields.
//
// The esz bits can be used directly by a SLL instruction, without masking.
//
// Note that the array-kind tag looks like 0x00 for instance klasses,
// since their length in bytes is always less than 24Mb.
//
// Final note: This comes first, immediately after C++ vtable,
// because it is frequently queried.
jint _layout_helper;
// Klass identifier used to implement devirtualized oop closure dispatching.
const KlassID _id;
// The fields _super_check_offset, _secondary_super_cache, _secondary_supers
// and _primary_supers all help make fast subtype checks. See big discussion
// in doc/server_compiler/checktype.txt
//
// Where to look to observe a supertype (it is &_secondary_super_cache for
// secondary supers, else is &_primary_supers[depth()].
juint _super_check_offset;
// 類名. Instance classes: java/lang/String, etc. Array classes: [I,
// [Ljava/lang/String;, etc. Set to zero for all other kinds of classes.
Symbol* _name;
// Cache of last observed secondary supertype
Klass* _secondary_super_cache;
// Array of all secondary supertypes
Array<Klass*>* _secondary_supers;
// Ordered list of all primary supertypes
Klass* _primary_supers[_primary_super_limit];
// java/lang/Class instance mirroring this class
OopHandle _java_mirror;
// Superclass
Klass* _super;
// First subclass (NULL if none); _subklass->next_sibling() is next one
Klass* volatile _subklass;
// Sibling link (or NULL); links all subklasses of a klass
Klass* volatile _next_sibling;
// All klasses loaded by a class loader are chained through these links
Klass* _next_link;
// 用於載入此類的VM對類載入器的表示。
//提供訪問相應的java.lang.ClassLoader例項
ClassLoaderData* _class_loader_data;
jint _modifier_flags; // 處理的訪問標誌,由Class.getModifiers使用
AccessFlags _access_flags; // 訪問標誌。 類/介面的區別就儲存在這裡
JFR_ONLY(DEFINE_TRACE_ID_FIELD;)
// 偏向鎖定實現和統計
// 64位塊優先,以避免碎片
jlong _last_biased_lock_bulk_revocation_time;
markOop _prototype_header; // Used when biased locking is both enabled and disabled for this type
jint _biased_lock_revocation_count;
// 虛表長度
int _vtable_len;
...
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2157/viewspace-2824350/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- JVM原始碼分析之Object.wait/notify實現JVM原始碼ObjectAI
- Java虛擬機器(二)物件的建立與OOP-Klass模型Java虛擬機物件OOP模型
- RediSearch和Redis Streams實戰原始碼Redis原始碼
- 【JVM】模型JVM模型
- JVM原始碼分析之Metaspace解密JVM原始碼解密
- JVM原始碼分析之Attach機制實現完全解讀JVM原始碼
- JVM 從入門到實戰--- 01 JVM 基本介紹JVM
- 在Golang中實現Actor模型的原始碼 - GauravGolang模型原始碼
- 《Python Web開發實戰》隨書原始碼PythonWeb原始碼
- ItemDecoration深入解析與實戰(一)——原始碼分析原始碼
- shiro 整合 spring 實戰及原始碼詳解Spring原始碼
- JVM效能調優與實戰篇JVM
- JVM類載入器ClassLoader原始碼剖析JVM原始碼
- JVM 原始碼分析(三):深入理解 CASJVM原始碼
- 分享《TensorFlow實戰》中文版PDF+原始碼原始碼
- 實戰:Nacos配置中心的Pull原理,附原始碼原始碼
- Java Agent入門實戰(二)-Instrumentation原始碼概述Java原始碼
- 【linux】i2c使用分析&原始碼實戰Linux原始碼
- 鴻蒙HarmonyOS實戰-Stage模型(程序模型)鴻蒙模型
- [原始碼解析] 模型並行分散式訓練 Megatron (3) ---模型並行實現原始碼模型並行分散式
- 模型的威力:基於模型,快速梳理原始碼模型原始碼
- shell指令碼企業實戰系列-nginx原始碼包安裝指令碼Nginx原始碼
- JVM 原始碼分析(四):深入理解 park / unparkJVM原始碼
- React-原始碼解析-DOM模型React原始碼模型
- Netty原始碼分析--Reactor模型(二)Netty原始碼React模型
- 一文解碼語言模型:語言模型的原理、實戰與評估模型
- 小程式入門到實戰(二)--案例原始碼分享原始碼
- 7個Python實戰專案(附原始碼),拿走就用Python原始碼
- 《Python資料分析與挖掘實戰》原始碼下載Python原始碼
- 【linux】系統呼叫版串列埠分析&原始碼實戰Linux串列埠原始碼
- JVM(八):Java 物件模型JVMJava物件模型
- JVM記憶體模型JVM記憶體模型
- python 坦克大戰原始碼Python原始碼
- Kotlin實戰--Retrofit網路模型Kotlin模型
- 深入理解JVM(一)JVM記憶體模型JVM記憶體模型
- 深入理解JVM(一)——JVM記憶體模型JVM記憶體模型
- 巧斷梯度:單個loss實現GAN模型(附開原始碼)梯度模型原始碼
- JVM 原始碼分析(二):搭建 JDK 8 原始碼除錯環境(Windows 上使用 CLion)JVM原始碼JDK除錯Windows