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. Jmeter(十八) - 从入门到精通 - JMeter后置处理器 -下篇(详解教程)

    1.简介 后置处理器是在发出“取样器请求”之后执行一些操作.取样器用来模拟用户请求,有时候服务器的响应数据在后续请求中需要用到,我们的势必要对这些响应数据进行处理,后置处理器就是来完成这项工作的.例如 ...

  2. js JQ动态添加div标签

    function renderList(data){ var str = ''; for(var i = 0; i < data.length; i++){ // 动态添加li str += ' ...

  3. Win7安装Python失败 提示Setup failed

    一.安装报错 如图所示,双击Python安装包后进行安装显示Setup failed 安装失败: 二.错误排除 1.首先查看自己的计算机是否已经安装了 Win7 Service Pack 1大补丁,没 ...

  4. 7.20试机测 T3 阶乘之和 暴力AC题解

    7.20试机测  T3 阶乘之和 暴力AC题解 题外话:此乃本蒟蒻发表的第一篇题解,大家多多关照,支持一下,谢谢 题面 3.阶乘之和(sum.pas/in/out) 问题描述: 给定一个非负整数 n, ...

  5. 【线性表基础】基于线性表的简单算法【Java版】

    本文描述了基于线性表的简单算法及其代码[Java实现] 1-1 删除单链表中所有重复元素 // Example 1-1 删除单链表中所有重复元素 private static void removeR ...

  6. Horse Pro(带负坐标的bfs搜索)

    Horse Pro bfs搜索,但图中存在负值坐标,两种方法解决. 用数组标记,将原点设为300,300 用map标记 http://oj.jxust.edu.cn/contest/Problem?i ...

  7. 推荐IT经理/产品经理,常用工具和网站

    一.  常用必备工具 1)文档工具 石墨文档,在线协作文档工具 https://shimo.im/ 2) 表格工具 麦客,在线问卷调查工具 http://www.mikecrm.com/ 3)脑图工具 ...

  8. A - New Building for SIS

    You are looking at the floor plan of the Summer Informatics School's new building. You were tasked w ...

  9. 今天完成了deviceman的程序,压缩成deivceman.rar

    目录在d:\android_projects\deviceman 压成了deviceman.rar 发送到了yzx3233@sina.com

  10. Druid 连接池

    记录Druid 连接池简单用法 package Utils; import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sq ...