一、对象的组成

      

    对象头(Header):

          运行时数据:存储对象运行时的数据,如哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等,这部分数据官方成为“Mark Word”,它的长度在32位和64位的虚拟机中分别是32bit和64bit。32bit的HotSpot虚拟机中,当对象未被锁定时的组成如下表:

                  

          类型指针:对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例

    实例数据:对象真正存储的有效信息,也是在程序中所定义的各种类型的字段内容

    对齐填充:这部分不是必然存在的,也没有特别的含义,它仅仅起着占位符的作用。由于HotSpot VM的自动内存管理系统要求对象起始地址必须是8字节的整数倍,

          也就是说对象必须是8字节的整数倍,因此当实例数据不是8字节的倍数的时候就需要占位符来填充

二、对象的创建

      1、虚拟机接收到new指令

      2、检查这个指令的参数能否在常量池中定位到一个类的符号引用,并且这个类是否已经被加载、解析和初始化过,如果没有则先执行类的加载过程

      3、虚拟机为新生对象分配内存空间

      4、将对象中的实例数据都初始化为零值

      5、设置对象的header部分的数据

      6、设置对象的实例数据

三、对象的访问

    在java程序总使用对象需要通过栈上的reference数据来操作堆上的对象。由于reference类型在java虚拟机规范中只规定了一个指向对象的引用,并没有定义这个引用通过

  何种方式去定位、访问堆中的对象的具体位置,所以对象访问方式是取决于虚拟机的实现的。目前主流的访问方式有使用句柄和直接指针两种。

  使用句柄方式:   

    使用句柄访问方式的最大好处就是reference中存储的是稳定的句柄地址,在对象被移动(GC操作时移动对象是非常普遍的行为)时只会改变句柄中的实例数据指针,而

 reference本身不需要修改。

        

   直接指针访问方式:     

    使用直接指针方式访问的最大好处是速度更快,它节省了一次指针定位的时间开销,由于对象的访问在java中非常频繁,因此这类开销积少成多后也是一项非常可观的的执

   行成本

          

  

jvm学习笔记之对象详解的更多相关文章

  1. expect学习笔记及实例详解【转】

    1. expect是基于tcl演变而来的,所以很多语法和tcl类似,基本的语法如下所示:1.1 首行加上/usr/bin/expect1.2 spawn: 后面加上需要执行的shell命令,比如说sp ...

  2. [C#] 类型学习笔记二:详解对象之间的比较

    继上一篇对象类型后,这里我们一起探讨相等的判定. 相等判断有关的4个方法 CLR中,和相等有关系的方法有这么4种: (1) 最常见的 == 运算符 (2) Object的静态方法ReferenceEq ...

  3. Struts2学习笔记(二)——配置详解

    1.Struts2配置文件加载顺序: default.properties(默认常量配置) struts-default.xml(默认配置文件,主要配置bean和拦截器) struts-plugin. ...

  4. Struts2学习笔记二 配置详解

    Struts2执行流程 1.简单执行流程,如下所示: 在浏览器输入请求地址,首先会被过滤器处理,然后查找主配置文件,然后根据地址栏中输入的/hello去每个package中查找为/hello的name ...

  5. Docker技术入门与实战 第二版-学习笔记-3-Dockerfile 指令详解

    前面已经讲解了FROM.RUN指令,还提及了COPY.ADD,接下来学习其他的指令 5.Dockerfile 指令详解 1> COPY 复制文件 格式: COPY  <源路径> .. ...

  6. vue.js学习笔记(二)——vue-router详解

    vue-router详解 原文链接:www.jianshu.com 一.前言 要学习vue-router就要先知道这里的路由是什么?为什么我们不能像原来一样直接用<a></a> ...

  7. Redis学习笔记4-Redis配置详解

    在Redis中直接启动redis-server服务时, 采用的是默认的配置文件.采用redis-server   xxx.conf 这样的方式可以按照指定的配置文件来运行Redis服务.按照本Redi ...

  8. Android学习笔记之Activity详解

    1 理解Activity Activity就是一个包含应用程序界面的窗口,是Android四大组件之一.一个应用程序可以包含零个或多个Activity.一个Activity的生命周期是指从屏幕上显示那 ...

  9. linux命令学习笔记-eval命令详解

    功能说明:重新运算求出参数的内容. 语 法:eval [参数] 补充说明:eval可读取一连串的参数,然后再依参数本身的特性来执行. 参 数:参数不限数目,彼此之间用分号分开. .eval命令将会首先 ...

随机推荐

  1. 微信小程序API登录凭证(code),获得的用户登录态拥有一定的时效性

    调用接口获取登录凭证(code)进而换取用户登录态信息,包括用户的唯一标识(openid) 及本次登录的 会话密钥(session_key).用户数据的加解密通讯需要依赖会话密钥完成. OBJECT参 ...

  2. leetcode378

    public class Solution { public int KthSmallest(int[,] matrix, int k) { ); ); var list = new List< ...

  3. Neo4j的集群架构

    Neo4j的集群架构 参考资料: 1.http://lib.csdn.net/article/mysql/5742,其中有集群的集中模式master-slave.sharding.多主模式.cassa ...

  4. 初次用SqlServer查看本地的Excel文件时需要注意的地方

    日常用到通过SqlServer 读取Excel文件的案例 ,记录下来 文件路径 :C:\Users\Administrator\Desktop\icd10.xls 1.查询语句: SELECT  *F ...

  5. Laravel 5.3 auth中间件底层实现详解(转)

    1. 注册认证中间件, 在文件 app/Http/Kernel.php 内完成: protected $routeMiddleware = [ 'auth' => \Illuminate\Aut ...

  6. document.ready与window.load区别

    jQuery document window load ready 区别详解 用过JavaScript的童鞋,应该知道window对象和document对象,也应该听说过load事件和ready事件, ...

  7. spring框架 事务 xml配置方式

    user=LF password=LF jdbcUrl=jdbc:oracle:thin:@localhost:1521:orcl driverClass=oracle.jdbc.driver.Ora ...

  8. 下载Redis

    1.下载当前Redis 官网:https://redis.io/ 当前稳定版本是4.0.11,如下图,点Download it下面的链接进行下载 2.下载历史版本的Resis 网址: http://d ...

  9. keepalived配置

    keepalived配置 之前已经安装完成,接下来我们配置keepalived. 假设我的ip地址如下: server1:192.168.0.150 server2:192.168.0.157 vip ...

  10. 利用GeoServer发布web地图服务

    参考: http://www.cnblogs.com/beniao/archive/2011/01/11/1931028.html http://www.cnblogs.com/LBSer/p/445 ...