JVM源码实战 - OOP-Klass模型
发布日期:2021-06-30 12:22:15
浏览次数:2
分类:技术文章
本文共 3701 字,大约阅读时间需要 12 分钟。
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* _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; ...
转载地址:https://javaedge.blog.csdn.net/article/details/103286134 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2024年04月12日 12时50分51秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
linux网卡生成UUID
2019-04-30
Vmware设置共享磁盘
2019-04-30
Oracle Enterprise Linux(OEL)镜像下载地址大全
2019-04-30
RAC修改scan listener的端口
2019-04-30
在安装Oracle RAC时,使用dbca建库提示默认的Listener没有配置
2019-04-30
Oracle RAC建库使用dbca磁盘组DiskGroup resource are not running on nodes. Database instance may not come up
2019-04-30
Oracle RAC集群dbca建库提示ASMSNMP用户权限不足问题
2019-04-30
Oracle RAC维护
2019-04-30
mybatis-plus入门教程
2019-04-30
easyui-combobox三级联动
2019-04-30
OpenResty服务器入门
2019-04-30
IDEA 2021 SSM框架使用easycode生成代码 (三)
2019-04-30
SSM框架角色管理数据库设计 (四)
2019-04-30
JPA 和 Mybatis 技术选型
2019-04-30
可以落地的DDD到底长什么样?
2019-04-30
设计模式在外卖营销业务中的实践
2019-04-30
DDD领域驱动设计在互联网业务开发中的实践
2019-04-30
一个微服务+DDD(领域驱动设计)的代码结构示例
2019-04-30