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. django-rest-framework-源码解析001-整体框架

    简介 Django Rest Framework是一个强大且灵活的工具包,主要用以构建RESTful风格的Web API. Django REST Framework(简称DRF)可以在Django的 ...

  2. 通过C语言获取MAC地址(转)

    原文:http://blog.chinaunix.net/uid-25885064-id-3125167.html #include <sys/ioctl.h>#include <n ...

  3. time strptime()方法 时间操作

    Python time strptime()方法 时间操作   描述 Python time strptime() 函数根据指定的格式把一个时间字符串解析为时间元组. 语法 strptime()方法语 ...

  4. phpcms根据二级栏目列表写的三级栏目列表

    <div class="container"> <!--左边树状导航--> <div class="CNLTreeMenu" id ...

  5. 以细胞为例 说一下dfs和bfs的思路

    今天发现很少写dfs.. dfs主要思想是递归 bfs主要靠队列 先说一下这个题我被阻了半个小时的地方: 1读数一定要注意scanf的吃回车 2注意数据类型为char,判断时是'0' dfs: #in ...

  6. 油田问题 bfs

    #include<iostream> #include<stdio.h> #include<stdlib.h> #include<time.h> #in ...

  7. org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/book]] Tomcat ServletXml 异常

    此异常是因为xml配置serlvet-url-pattern缺少’/’     应该改为 /regist   背景: 写了base标签 form表单的action属性的值   个人分析: ️表单提交时 ...

  8. mongoose.model第三个参数的问题

    这个是个好问题,之前按照教程做的数据库没有问题,现在自己从新做出现了问题.还好之前有无意中接触了这个知识点,不然感觉真的很难解决. 在检查完所有东西都没错的时候(前端传给req的数据正常,与数据库相符 ...

  9. MySQL三种InnoDB、MyISAM和MEMORY存储引擎对比

    什么是存储引擎? MySQL中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不同的功能和能力.通过选择不同的技术,你能 ...

  10. 自述:转职IT ,痛苦一阵子;不转职IT,痛苦一辈子(第一章)

    作为一个从后期制作转职过来的Java工程师,我认为我是幸运的,虽然我的本科专业(影视后期)也是火爆行业,不愁工作,但我不后悔进入这个IT坑,毕竟转行,只痛苦一阵子,但是不转行,可能我会痛苦一辈子. 我 ...