目录:
java虚拟机汇总

  1. class文件结构分析
    1).class文件常量池中的常量项结构
    2). 常用的属性表的集合
  2. 类加载过程
    1).类加载器的原理以及实现
  3. 虚拟机结构分析
    1).jdk1.7和1.8版本的方法区构造变化
    2).常量池简单区分
  4. 对象结构分析<<== 现在位置
    1).压缩指针详解
  5. gc垃圾回收
  6. 对象的定位方式

题外链接:(压缩指针详解)
目标:能够算出一个对象的具体长度

对象是在堆中创建的
对象的内部结构图为

这就是一个对象的基本结构,下面每一个结构详细说明

1.对象头中的MarkWord

图为马士兵的64位虚拟机MarkWord头信息,每一行都是一种markWord的状态(不是全部代表markword)

然后是32位操作系统的

markWord在32操作系统中是32位,在64操作系统中,不管开不开启指针压缩(指针压缩详解)都是64位,8个字节
下面逐个说明下每个字段的意义(64位的,32位同理),目前在jvm阶段的了解即可

  1. 锁状态

    这里分为两个部分,偏向锁位和锁标志位,他们两个共同决定锁的状态(锁升级将在并发编程中说)
    偏向锁位:对象是否启用偏向锁标记,只占1个二进制位。为1时表示对象启用偏向锁,为0时表示对象没有偏向锁。
    锁标志位:这两位的标志决定了markword整体的格式,可以从图中很明了的看出,每一种锁标志位对应的整个markWord的存储格式都有所不同

  2. 锁状态为0 01
    此时

    1. 前25位没有使用,
    2. hashCode占了31位,存放该对象的哈希码
    3. 1位没有使用
    4. 4位分代年龄,表示了对象在堆中的分代信息,即最高15(这也是目前ps+po的分代年龄)
  3. 锁状态为1 01
    此时此对象为偏向锁状态,原来的hashCode无法存储,转存到管程Monitor中

    1. 前面54位为指向你那个线程的id
    2. 接下来2位为Epoch:偏向锁的时间戳,如果一个线程来对此对象加锁,发现时间戳和自己的不一样(这个是cas操作中的解决aba问题的版本号,每次偏向时加1),说明有其他线程执行了,此线程将会重新尝试偏向,即重偏向,重新执行cas操作修改前面54位的线程id,如果失败了说明此时有线程在使用,就立即进行锁膨胀(第一次发现有竞争时,就立即膨胀为轻量级锁,再在轻量级锁进行8次cas操作,如果都失败了,就再膨胀为重量级锁)
    3. 接下来1位没有用到
    4. 在接下来的4位仍然为分代年龄
  4. 锁状态为 00
    此时状态为轻量级锁(自旋锁),说明此时已经有至少一次竞争了
    1. 62位都为线程栈中栈的指针(注:和1 01的54位线程id不一样,一个是id,一个是指针)

  5. 锁状态为 10
    重量级锁,直接把自旋的线程全部由cpu扔到内存阻塞队列里去,这里由cpu到内存的过程涉及到了系统的中断,消耗资源较高,所以这也是jdk1.6以前synchronized只用重量级锁效率低的问题,现在引入了偏向自旋锁来减少这种中断的发生
    1. 62位都指向互斥量(重量级锁监视器)指针

  6. gc标记信息
    此需要知道CMS并发标记清除垃圾收集器,

    1. 62位为CMS过程中的标志信息

2.对象头中的kClass

这一部分存储对象的类型指针,该指针指向方法区的类元数据,JVM通过这个指针确定对象是哪个类的实例,长度:32位的JVM为32位,64位的JVM为64位。64位操作系统开启压缩指针后为32位(前面已经提到,一定要看压缩指针详解))

3.实例数据

这里才是最大的数据存储区,没有什么可说的int a =3,就存个int类型的a值为3,如果值是常量或静态的则直接指向方法区中的对应数据,关于这部分的长度,在(压缩指针详解)解析

4.对齐填充

整个对象都要以8字节为基准,比如前面为12字节,那对齐填充就是4字节,加起来是16,可以被8整除,至于为什么,因为操作系统总线带宽是以8字节为基础传输,所以提高传输效率之类的巴拉巴拉。。。

java类对象的内部结构图解(java对象模型精讲)相关推荐

  1. 规则引擎集成接口(九)Java类对象

    Java类对象 右键点击"对象库" -"添加java类对象",如下图: 弹出窗体,在文本框中输入类的全名"com.flagleader.test.Te ...

  2. 看完这篇你还敢说分不清 Java 类 对象 实例 变量间的区别?

    看完这篇你还敢说分不清 Java 类 对象 实例 变量间的区别? 什么是类? 什么是对象? 什么是变量? 对象和类的关系: Java中的类: Java中的对象 Java中的变量 Java 中调用 对象 ...

  3. JSON对象转为Java类对象

    本文讲述两种方法,使JSON对象转为Java类对象.基于FastJson1 对于以下的JSON对象: {"message": "成功","code&q ...

  4. java类对象转化成字符串_String类型字符串(xml格式)转换成java对象类型

    使用到的包: 1. 2. 将字符串类型的字符串转换成的Java的对象时,需要先将字符的格式转换成JSON格式的字符串(所以用到了json.jar包),在使用JSON格式的字符串转换成的Java的对象类 ...

  5. 【群友问题讨论】java类对象数组一些知识盲区

    爱学习的群友问了一道题,靠着我刚过英语四级的水平,翻译一下就是:下列哪个关键词是定义java类所必要的,答案显而易见是class,因为"类"这个名词就是由"class&q ...

  6. java类对象实验问题_Java类与对象实验答案

    Java类与对象实验答案Tag内容描述: 1.Java实验报告 计科.信工版2013-2014-2 实验报告 一.实验项目:类与对象 二.实验目的: 1. 学会使用类来封装对象的属性和功能 2. 掌握 ...

  7. java 嵌套对象转xml_Gson对Java嵌套对象和JSON字符串之间的转换 | 学步园

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,具有良好的跨平台特性.近几年来已经和XML一样成为C/S架构中广泛采用的数据格式.有关JSON的更多知识, ...

  8. java类的讲解_【java 基础】java类的权限讲解

    java类权限有四种,分别是public,protected,private和默认的权限.其中前三个权限是有明确定义的修饰符的,而默认的权限没有明确的修饰符(我们可以称之为default),在定义类, ...

  9. java 静态对象赋值_基于Java class对象说明、Java 静态变量声明和赋值说明(详解)...

    先看下JDK中的说明: java.lang.Object java.lang.Class Instances of the class Class represent classes and inte ...

最新文章

  1. html5 canvas实现图片玻璃碎片特效
  2. Powerful array CodeForces - 86D (莫队算法)
  3. python脚本:向表中插入新数据,删除表中最旧的数据
  4. Oracle 时区(TimeZone )-- DST
  5. 实锤!Python 真没你想的那么简单…
  6. mysql 5.7 plugin 安装_mysql5.7以上版本安装
  7. 空格 路径_python处理Windows平台上路径有空格
  8. Live2D和wallpaperEngine公用
  9. y7000p屏幕亮度低_联想拯救者y7000p怎么样 评测结果揭晓屏幕优点
  10. ubuntu16.04.4环境下mingw32交叉编译环境搭建
  11. 基于KNN的手写数字识别
  12. ESP32-C3入门教程 IoT篇⑤——阿里云 物联网平台 EspAliYun RGB LED 实战之设备生产流程
  13. Flixel Dame 坦克大战(二)Dame-editor使用指南
  14. 字节日常实习生面试 无了~
  15. python程序设计实用教程清华大学出版社_清华大学出版社-图书详情-《Python程序设计简明教程》...
  16. 选择排序(升序排列)
  17. 【BLE】CC2541之动态广播加密数据
  18. mysql删除表中数据
  19. CleanMyMac 3自定义智能清理
  20. 如何解决计算机黑屏问题,电脑黑屏怎么处理(三个键教您解决黑屏问题)

热门文章

  1. bzoj 1312: Hard Life 01分数规划+网络流
  2. css中float left与float right的使用说明
  3. BoxFilter包滤波器
  4. Android使用init.rc触发脚本实现隐藏内置应用
  5. 在 NetBeans IDE 6.0 中分析 Java 应用程序性能
  6. [物理学与PDEs]第5章习题6 各向同性材料时强椭圆性条件的等价条件
  7. JSK-11 移除数组中的重复元素【入门】
  8. CCF NOI1142 质数
  9. CCF NOI1075 F函数
  10. C++基础——用C++实例理解UML类图