zoukankan      html  css  js  c++  java
  • JVM中对象模型及相应名词概念

    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在方法区

  • 相关阅读:
    PL/SQL中的 not
    正则12和\1的理解
    eclipse/myeclipse注释模板的修改
    jboss修改内存
    myEclipse开发内存溢出解决办法myEclipse调整jvm内存大小 java.lang.OutOfMemoryError: PermGen space及其解决方法
    MyEclipse 启动报错:'Building workspace' has encountered a problem解决方法
    jboss 7.1.1.final 报错 set the maxParameterCount attribute on the Connector
    在 Ubuntu/Debian 下安装 PHP7.3 教程
    mariadb新安装解决远程访问以及root登录
    Docker 探索安装WordPress+Mysql8.0
  • 原文地址:https://www.cnblogs.com/simoncook/p/11804427.html
Copyright © 2011-2022 走看看