JVM中对象模型及相应名词概念

java对象在jvm中的模型是OOP-Klass 模型;

klass

klass对应元数据,包括常量池、字段、方法等。是在加载class阶段创建instanceKlass。存放在方法区。

oop

oop对应java中的实例。

oop是指向oopDesc的指针。

// share/vm/oops/oopsHierarchy.hpp
typedef class oopDesc* oop; // SimonNote: oop是指向oopDesc的指针

oopDesc

instanceOOpDesc只包含数据信息,主要由以下部分组成:

  1. 对象头,也叫markword。主要存储对象运行时记录信息,如hashcode,GC分代年龄,锁状态标志,线程id,时间戳等
  2. 元数据指针,这里指指向方法区的instanceKlass实例
  3. 实例数据,(我的理解 对其获取与存取的方式是按对象头为基址做相对偏移后操作的,可以参见oop.inline.hpp的obj_field_addr方法)
  4. 如果是数组对象,还多一个数组长度

oopDesc的结构图示:



先是头部,头部后面接着数据,数据后面接着对其填充;头部包含mark和元数。

oop是普通对象指针之意,对象指针好理解,但是最前面那个o是普通的意思,怎么理解这个普通?参见R大解释

为什么把GC托管指针叫做oop?对象指针不就是指针么,为啥还要加一个“普通”来修饰?

这有个有趣的历史原因。对Smalltalk与HotSpot VM的渊源有所了解的话就会知道。在Strongtalk VM的文档里有详细描述:https://code.google.com/p/strongtalk/wiki/VMTypesForSmalltalkObjects

关键点在于在Smalltalk的对象由GC来管理,而其许多实现里都会用所谓“直接对象”的方式来实现一些简单的值类型对象,例如SmallInteger。所谓“直接对象”(immediate object)就是并不在GC堆上分配对象实例,而是直接将实例内容存在对象指针里的对象。这样的指针也叫做“带标记的指针”(tagged pointer)。

于是在这种环境中,每当我们拿到一个对象指针时,都得先问它:你是一个直接对象还是一个真的指针?如果是真的指针,它就是一个“普通”的对象指针了。这样对象指针就有了“普通”与“不普通”之分。

这个语境中的oop也被认为是“object oriented pointer”的缩写。无论是“ordinary object pointer”还是“object oriented pointer”,其实要说的事情是一模一样的。以前术语特别混乱,oop到底最最初是谁的缩写就不大好考证了。

关于tagged pointer,HLLVM群组的一个老帖也有讨论:http://hllvm.group.iteye.com/group/topic/17840#post-126408

之间关系

举例:

Person示例---- ---> ------- Person的instanceKlass------- ------- -->---------- ------- Person的class

instanceOopDesc -- ------JDK8在metaspace,JDK6 7 在方法区 --------- ------- JDK7 8 在堆中,JDK6在方法区

JVM中对象模型及相应名词概念的更多相关文章

  1. Docker系列(2)- Docker中的名词概念

    Docker工作流程 名词概念 镜像(image): docker镜像就好比一个模板,可以通过这个模板来创建容器服务,tomcat镜像===>run===>tomcat01(提供服务器) ...

  2. [转]JVM调优总结:一些概念

    JVM调优总结:一些概念 原文出处: pengjiaheng 数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型.基本类型的变量保存原始值,即:他代表的值就是数值本身:而引用类型的变 ...

  3. JVM中的垃圾收集算法和Heap分区简记

    如何判断垃圾对象? 垃圾收集的第一步就是先需要算法来标记哪些是垃圾,然后再对垃圾进行处理.   引用计数(ReferenceCounting)算法 这种方法比较简单直观,FlashPlayer/Pyt ...

  4. python中基于descriptor的一些概念

    python中基于descriptor的一些概念(上) 1. 前言 2. 新式类与经典类 2.1 内置的object对象 2.2 类的方法 2.2.1 静态方法 2.2.2 类方法 2.3 新式类(n ...

  5. 《深入Java虚拟机学习笔记》- 第7章 类型的生命周期/对象在JVM中的生命周期

    一.类型生命周期的开始 如图所示 初始化时机 所有Java虚拟机实现必须在每个类或接口首次主动使用时初始化: 以下几种情形符合主动使用的要求: 当创建某个类的新实例时(或者通过在字节码中执行new指令 ...

  6. JVM中堆内存和栈内存的区别

    Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间 ...

  7. JVM入门到放弃之基本概念

    1. 基本概念 jvm 是可运行Java代码的假想计算机,包括一套字节码指令集.一组寄存器.一个栈.一个垃圾回收堆和一个存储方法域. jvm 是运行在操作系统之上的,屏蔽了与具体操作系统平台相关的信息 ...

  8. Synchronized 和 Lock 锁在JVM中的实现原理以及代码解析

    一.深入JVM锁机制:synchronized synrhronized关键字简洁.清晰.语义明确,因此即使有了Lock接口,使用的还是非常广泛.其应用层的语义是可以把任何一个非null对象作为&qu ...

  9. JVM中的新生代、老年代和永生代

    1.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能.你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我 ...

随机推荐

  1. jspang 做个那个pos系统--学习笔记

    /为什么不能使用Object.assign() //使用Object.assign之后数据会发生改变,但是试图没有跟新 <template> <div class="pos ...

  2. 重学数据结构(三)——使用单链表实现LRU淘汰缓存机制

    使用单链表实现LRU(Least Recently Used)淘汰缓存机制 需求:存在一个单链表,在单链表尾部的都是越早之前添加的元素. 当元素被访问到时,会添加进缓存(也就是这个单链表中). 如果这 ...

  3. git pull & git fetch

    Git中从远程的分支获取最新的版本到本地有这样2个命令:1. git fetch:相当于是从远程获取最新版本到本地,不会自动merge   git fetch origin mastergit log ...

  4. 16 . Go之网络编程

    互联网的本质 两台计算机之间的通信与两个人打电话原理是一样的. # 1. 首先要通过各种物理连接介质连接 # 2. 找准确对方计算机(准确到软件)的位置 # 3. 通过统一的标准(一般子协议)进行数据 ...

  5. 跟老刘学运维day03~新手必须掌握的Linux命令(3)

    第2章 Linux命令 今天已经跟老刘学习运维第三天了,前两天对虚拟机和Linux系统的安装进行了深入的学习,今天开始命令的学习 系统状态检测命令 1.ifconfig   2.uname:查看系统内 ...

  6. logrotate nginx日志切割

    1.安装 centos: yum -y install logrotate ubuntu: apt-get install -y logrotate 2. 配置文件 /etc/logrotate.co ...

  7. sublimeCLang配置报错以及sublime快捷键

    subimeClang需要手动配置我真的真的很服 记录一下满是报错的高光时刻 -------- 不过这个问题刚刚解决了 只要把所有的shared_ptr改成std::shared_ptr 就行 说白了 ...

  8. PythonFile对象的属性

    PythonFile对象的属性: 一个文件被打开后,使用对象进行接收,接收的对象即为 File 对象 示例: ''' file.closed 返回true如果文件已被关闭,否则返回false file ...

  9. Skill art函数遍历字典

    https://www.cnblogs.com/yeungchie/ code procedure(ycartGo(length1) prog(() for(x 1 length1 printf(&q ...

  10. Python PIL方式打开的图片判断维度

    1. PIL方式打开的图片判断维度    好久没更新啦,哈哈哈~~!今天跟宝宝们分享一篇如何判断灰度图像和彩色图像维度的方法.我们在读取灰度图像和彩色图像时,发现读取出来的图片维度不同,当我们要做后续 ...