【理解HotSpot虚拟机】对象在jvm中的表示:OOP-Klass模型

转载请注明出处:http://blog.csdn.net/linxdcn/article/details/72896616


1 概述

HotSpot是基于c++实现,而c++是一门面向对象的语言,本身具备面向对象基本特征,所以Java中的对象表示,最简单的做法是为每个Java类生成一个c++类与之对应。

但HotSpot JVM并没有这么做,而是设计了一个OOP-Klass Model。这里的 OOP 指的是 Ordinary Object Pointer (普通对象指针),它用来表示对象的实例信息,看起来像个指针实际上是藏在指针里的对象。而 Klass 则包含元数据和方法信息,用来描述Java类。

之所以采用这个模型是因为HotSopt JVM的设计者不想让每个对象中都含有一个vtable(虚函数表),所以就把对象模型拆成klass和oop,其中oop中不含有任何虚函数,而Klass就含有虚函数表,可以进行method dispatch。

2 OOP-Klass模型

2.1 Klass

Klass简单的说是Java类在HotSpot中的c++对等体,用来描述Java类。

Klass主要有两个功能:

  • 实现语言层面的Java类
  • 实现Java对象的分发功能

哪Klass是什么时候创建的呢?一般jvm在加载class文件时,会在方法区创建instanceKlass,表示其元数据,包括常量池、字段、方法等。

2.2 OOP

Klass是在class文件在加载过程中创建的,OOP则是在Java程序运行过程中new对象时创建的。

一个OOP对象包含以下几个部分:

  • instanceOopDesc,也叫对象头
    • Mark Word,主要存储对象运行时记录信息,如hashcode, GC分代年龄,锁状态标志,线程ID,时间戳等
    • 元数据指针,即指向方法区的instanceKlass实例
  • 实例数据

3 实例说明

假如我们有如下代码:

class Model
{
    public static int a = 1;
    public int b;

    public Model(int b) {
        this.b = b;
    }
}

public static void main(String[] args) {
    int c = 10;
    Model modelA = new Model(2);
    Model modelB = new Model(3);
}

上述代码得OOP-Klass模型入下所示




转载请注明出处:http://blog.csdn.net/linxdcn/article/details/72850375

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
引用是一个Dockerfile的示例,用于构建Java应用程序的镜像。其使用了adoptopenjdk:11-jre-hotspot作为基础镜像,并在其复制了构建好的应用程序文件,并设置了启动命令。这个镜像是基于AdoptOpenJDK 11的,并使用了OpenJDK的基础设施、构建和测试脚本来生成预先构建的二进制文件。 而引用则是一系列关于Java语言基础的教程和示意图,其提到了JDK的概述、下载过程、安装过程和卸载过程。 回答没有直接回答到提问的具体内容"FROM adoptopenjdk:11-jdk-hotspot",因此无法根据提供的引用内容回答该问题。请提供更多的信息以便我可以为您提供准确的答案。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [spring boot 构建项目优化dockerfile](https://blog.csdn.net/qq_34041723/article/details/124153520)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [OpenJDK11U-jdk_x64_windows_hotspot_11.0.9_11.msi](https://download.csdn.net/download/weixin_42072817/13102655)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Java基础视频教程-深入浅出学Java精华版](https://download.csdn.net/download/weixin_36643308/88226754)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值