http://blog.csdn.net/linxdcn/article/details/72850375
本人基于上文做了简单的整理,解释及拓展,方便像和我一样不熟悉C++的人能更好的理解原文中的一些概念

介绍

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。

OOP-Klass 模型是对象在JVM中的表示

Klass

Klass: 包含元数据和方法信息,用来描述Java类

Klass主要有两个功能:

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

一般jvm在加载class文件时,会在方法区创建instanceKlass,表示其元数据,包括常量池、字段、方法等。

OOP

OOP: Ordinary Object Pointer (普通对象指针),它用来表示对象的实例信息,看起来像个指针实际上是藏在指针里的对象

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

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

  • instanceOopDesc,也叫对象头

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

目的

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

关键词解析

vtable: C++中每一个有虚函数的类,都有vtable(虚函数表)

虚函数: 同Java方法(函数),C++中的有虚函数的概念,用virtual 关键字来表示,每个类都会有一个虚函数表,该虚函数表首先会从父类中继承得到父类的虚函数表, 如果子类中重写了父类的虚函数(不管重写后的函数是否为虚函数),要调用哪个虚函数,是根据当前实际的对象来判断的(不管指针所属类型是否为当前类,有可能是父类型),指针当前指向的是哪种类型的对象,就调用哪个类型中类定义的虚函数。每个类只有一张虚拟函数表,所有的对象共用这张表。在Java中,自动实现了虚函数这一概念:多态——父类的变量,调用子类的方法

纯虚函数: 同Java抽象方法,C++中主要特征是不能被用来声明对象,是抽象类,是用来确保程序结构与应用域的结构据具有直接映射关系的设计工具。带有纯虚函数的类称为抽象类,抽象类能被子类 继承使用,在子类中必须给出纯虚函数的实现,如果子类未给出该纯虚函数的实现,那么该子类也是抽象类,只有在子类不存在纯虚函数时,子类才可以用来声明对 象!抽象类也能用于声明指针或引用,或用于函数声明中。具有抽象类特性的类还有构造函数和析构函数,全部是保护的类。如果没有给出纯虚函数的实现,则在它 所在的类的构造函数或析构函数中不能直接或间接的调用它。纯虚函数的实现可以在类声明外进行定义。

抽象类: 同Java抽象类,C++中指同时含有纯虚函数和非纯虚函数的类

纯虚类: 同Java接口,C++中指只含有纯虚函数的类

C++ Java
虚函数 普通函数
纯虚函数 抽象函数
抽象类 抽象类
纯虚类 接口

拓展: C++中普通函数不存在多态——不会根据实际的对象来判断调用函数,而是直接调用当前变量类型的方法

实例说明

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模型入下所示

作者:在下Z
链接:https://www.jianshu.com/p/424a920771a3
來源:简书

对象在JVM中的表示: OOP-Klass模型相关推荐

  1. 类和对象在JVM中是如何存储的,竟然有一半人回答不上来!

    前言 这篇博客主要来说说类与对象在JVM中是如何存储的,由于JVM是个非常庞大的课题,所以我会把他分成很多章节来细细阐述,具体的数量还没有决定,当然这不重要,重点在于是否可以在文章中学到东西,是否对J ...

  2. 7. 重磅硬核 | 一文聊透对象在JVM中的内存布局,以及内存对齐和压缩指针的原理及应用

    重磅硬核 | 一文聊透对象在JVM中的内存布局,以及内存对齐和压缩指针的原理及应用 大家好,我是bin,又到了每周我们见面的时刻了,我的公众号在1月10号那天发布了第一篇文章?<从内核角度看IO ...

  3. 一文聊透对象在JVM中的内存布局,以及内存对齐和压缩指针的原理及应用

    大家好,我是bin,又到了每周我们见面的时刻了,我在1月10号那天发布了第一篇文章<从内核角度看IO模型的演变>,在这篇文章中我们通过图解的方式以一个C10k的问题为主线,从内核角度详细阐 ...

  4. JAVA对象在JVM中内存分配

    如果你还不了解JVM内存模型的建议您先看下JVM内存模型 以一下代码为例,来分析下,java对象在内存中的空间分配. public class Student {private String name ...

  5. 7、Java 对象在 JVM 中的内存布局(详细说明)

    文章目录 一.new 对象的几种说法 二.Java 对象在内存中的存在形式 1. 栈帧(Frame) 2. 对象在内存中的存在形式 ① 3. 对象中的方法存储在那儿? 4. Java 对象在内存中的存 ...

  6. java jvm对象_Java对象在JVM中长啥样

    前言 Java 是门面向对象的开发语言,那么我们自己编写的 Java 类生成的对象是什么样的?它肯定保存在虚拟机的内存中,但它以怎样的结构来保存的呢?带着疑问往下看看. 关于Klass Java 层的 ...

  7. Java里面长什么样,Java对象在JVM中长啥样

    前言 Java 是门面向对象的开发语言,那么我们自己编写的 Java 类生成的对象是什么样的?它肯定保存在虚拟机的内存中,但它以怎样的结构来保存的呢?带着疑问往下看看. 关于Klass Java 层的 ...

  8. 蚂蚁面试:字符串在JVM中如何存放?

    字符串对象在JVM中可能有两个存放的位置:字符串常量池或堆内存. 使用常量字符串初始化的字符串对象,它的值存放在字符串常量池中: 使用字符串构造方法创建的字符串对象,它的值存放在堆内存中: Strin ...

  9. 字符串在JVM中如何存放 及常量池技术

    字符串对象在JVM中可能有两个存放的位置:字符串常量池或堆内存. 使用常量字符串初始化的字符串对象,它的值存放在字符串常量池中: 使用字符串构造方法创建的字符串对象,它的值存放在堆内存中: Strin ...

最新文章

  1. (第7篇)灵活易用易维护的hadoop数据仓库工具——Hive
  2. pyaudio:基于pyaudio利用Python编程从电脑端录制音频保存到指定文件夹+将录音上传服务器+录音进行识别并转为文本保存
  3. orika java_Orika JavaBean映射工具探秘
  4. 广西计算机一级考试是机考吗,广西计算机一级考试机考模式探索及应用.doc
  5. 公共界面_公共建筑东营市档案馆能耗计量分析系统
  6. 2020年7月美妆行业抖音小红书营销报告
  7. 【Kafka】Mac 环境 Kafka诡异问题之kafka eagle 界面无法访问
  8. python3 unicodeencodeerror_解决 Python3 下 print 时出现 UnicodeEncodeError 的问题
  9. 让 “微软雅黑” 在IE6下完美显示
  10. OpenGL学习笔记(3) 纹理
  11. 关于进行安装程序出现注册DLL/OCX失败,返回码:0x5问题
  12. TIM无法打开本地文件
  13. SSH框架之文件上传
  14. leapftp怎么上传,小编教你leapftp怎么上传文件
  15. React在ESLint下的报错收录(react-hooks/exhaustive-deps)
  16. 公有云上应该怎么做容灾?
  17. 【SSL】谷仓的安保
  18. 某资讯App signature签名分析 (一)
  19. 校招|我的秋招记录——(自然语言处理-面经+感悟)
  20. 把ipa包上传入AppStore

热门文章

  1. spring websocket源码分析
  2. mysql重连,连接丢失:The last packet successfully received from the server--转载
  3. 指向函数的指针--转
  4. struts深入原理之RequestProcessor与xml
  5. Lesson 12.3 线性回归建模实验
  6. 基于迁移学习的反欺诈方法研究
  7. C语言中嵌入正则表达式
  8. Yann LeCun:掌舵Facebook人工智能 | 完美人物志
  9. 深度机器学习中的batch的大小对学习效果有何影响?
  10. Apache + PHP为什么不能在www目录下写文件以及如何解决PHP写文件问题