java对象保存在内存中时有3个部分

1.对象头

2.实例数据

3.对齐填充字节

一. 对象头

​ java的对象头有3部分组成:

​ 1.Mark Word

​ 2.指向类的指针

​ 3.数组长度(如果是数组对象的话才有)

1.Mark Word

Mark Word 存储的内容 32bit 中如下所示:

其中无锁和偏向锁的锁标志位都是01 只是用前一位来表示是无锁还是偏向锁

JDK1.6后的版本在处理同步锁时存在锁升级的概念,JVM对于同步锁的处理是从偏向锁开始的 处理方式从偏向锁升级到轻量锁 最终升级为重量级锁.

Ps :锁只可单向升级 不可降级

JVM一般是这样使用锁和Mark Word的:

JVM一般是这样使用锁和Mark Word的:

1,当没有被当成锁时,这就是一个普通的对象,Mark Word记录对象的HashCode,锁标志位是01,是否偏向锁那一位是0。

2,当对象被当做同步锁并有一个线程A抢到了锁时,锁标志位还是01,但是否偏向锁那一位改成1,前23bit记录抢到锁的线程id,表示进入偏向锁状态。

3,当线程A再次试图来获得锁时,JVM发现同步锁对象的标志位是01,是否偏向锁是1,也就是偏向状态,Mark Word中记录的线程id就是线程A自己的id,表示线程A已经获得了这个偏向锁,可以执行同步锁的代码。

4,当线程B试图获得这个锁时,JVM发现同步锁处于偏向状态,但是Mark Word中的线程id记录的不是B,那么线程B会先用CAS操作试图获得锁,这里的获得锁操作是有可能成功的,因为线程A一般不会自动释放偏向锁。如果抢锁成功,就把Mark Word里的线程id改为线程B的id,代表线程B获得了这个偏向锁,可以执行同步锁代码。如果抢锁失败,则继续执行步骤5。

5,偏向锁状态抢锁失败,代表当前锁有一定的竞争,偏向锁将升级为轻量级锁。JVM会在当前线程的线程栈中开辟一块单独的空间,里面保存指向对象锁Mark Word的指针,同时在对象锁Mark Word中保存指向这片空间的指针。上述两个保存操作都是CAS操作,如果保存成功,代表线程抢到了同步锁,就把Mark Word中的锁标志位改成00,可以执行同步锁代码。如果保存失败,表示抢锁失败,竞争太激烈,继续执行步骤6。

6,轻量级锁抢锁失败,JVM会使用自旋锁,自旋锁不是一个锁状态,只是代表不断的重试,尝试抢锁。从JDK1.7开始,自旋锁默认启用,自旋次数由JVM决定。如果抢锁成功则执行同步锁代码,如果失败则继续执行步骤7。

7,自旋锁重试之后如果抢锁依然失败,同步锁会升级至重量级锁,锁标志位改为10。在这个状态下,未抢到锁的线程都会被阻塞。

2,指向类的指针

该指针在32位JVM中的长度是32bit,在64位JVM中长度是64bit。

Java对象的类数据保存在方法区。

3,数组长度

只有数组对象保存了这部分数据。

该数据在32位和64位JVM中长度都是32bit。

二,实例数据

对象的实例数据就是在java代码中能看到的属性和他们的值。

三,对齐填充字节

因为JVM要求java的对象占的内存大小应该是8bit的倍数,所以后面有几个字节用于把对象的大小补齐至8bit的倍数,没有特别的功能。

本文由博客群发一文多发等运营工具平台 OpenWrite 发布

java文件头_对java文件头的解析相关推荐

  1. java api文档_细说API – 文档和前后端协作

    在上一篇文章--<细说API – 重新认识RESTful>中介绍了如何理解和设计RESTful风格的API,现在我们来聊聊如何有效的呈现API文档,以及前后端协作的方式. 我经历过一些没有 ...

  2. java rest框架_比较Java REST文档框架

    java rest框架 决定在记录REST API时选择哪种Java框架可能很麻烦. 在本博文中,我们将简要比较我们自己使用的REST Web服务的三个文档框架,以及它们如何与Spring框架(这是F ...

  3. 怎样查阅java的api文档_【java基础(十)】查阅API文档

    为什么要查询API文档 就好比学习汉字,学习英语,都免不了要查询字典.词典.因为包含东西太多,切不必每个都需要学习.记住,在需要用的时候可以快速查询即可. String类就包含50多个方法,且几乎所有 ...

  4. java 图片 word文档_【Java】用Freemarker完美导出word文档(带图片)

    Java  用Freemarker完美导出word文档(带图片) 前言 最近在项目中,因客户要求,将页面内容(如合同协议)导出成word,在网上翻了好多,感觉太乱了,不过最后还是较好解决了这个问题. ...

  5. java 字符串包_包java字符串

    Java核心技术卷I基础知识3.6.3 不可变字符串 3.6.3 不可变字符串 String类没有提供用于修改字符串的方法.如果希望将greeting的内容修改为"Help!",不 ...

  6. java path类_基于java Files类和Paths类的用法(详解)

    Java7中文件IO发生了很大的变化,专门引入了很多新的类: import java.nio.file.DirectoryStream; import java.nio.file.FileSystem ...

  7. bigint对应java什么类型_「JAVA」从格式化输出到扫描输入,深究Java正则表达式匹配之道

    字符串是不可变的 字符串是不可变的,也就是说当字符串的内容发生改变的时候,会创建一个新的String对象:但是如果内容没有发生改变的时候,String类的方法会返回原字符串对象的引用. 而正则表达式往 ...

  8. java applet配置_配置Java Applet的运行环境

    Java小程序,也就是Java Applet,可以在Web浏览器中运行.Java Applet必须以脚本的形式嵌入到HTML页面中,才能在web浏览器中运行. 之前总以为本地安装了JDK,指定好JAV ...

  9. java 生产者消费者_基于JAVA的生产者消费者问题

    一.需求分析 为了更好地理解进程同步的机制和过程,决定设计实现生产者消费者问题的解决,以实现进程的同步控制. 题目描述:有n个生产者在生产产品,这些产品将提供给m个消费者去消费,为了使生产者和消费者能 ...

  10. java高级教程_高级Java教程

    java高级教程 课程大纲 学习Java基础很容易. 但是,真正钻研该语言并研究其更高级的概念和细微差别将使您成为一名出色的Java开发人员. 网络上充斥着"软","便宜 ...

最新文章

  1. Android 关于::app:clean :app:preBuild UP-TO-DATE :app:preDebugBuild UP-TO-DATE,引用jar冲突问题...
  2. 画活动图教程_绘画教程116—传统的山水现代的刀画,看了就会的步骤图
  3. php引用类失败,php – 致命错误:调用未定义的方法stdClass
  4. windows时间显示到秒
  5. 酷乐Emlog新春特别版coolappy2.2开源
  6. http协议中content-length 以及chunked编码分析
  7. 迁移到 Centos 7 遇到的一些常见问题
  8. KVM基础安装,手动创建桥
  9. Linux-进程基础
  10. 启动U盘更换背景图片和图标的方法
  11. 模拟布朗运动与几何布朗运动
  12. 从0开发豆果美食小程序——项目搭建
  13. 健康管理项目第九天(套餐预约之占比饼形图、运营数据统计、报表导出 )
  14. 斩不断、理还乱,论家事,别有一番滋味在心头。
  15. GitHub构建Maven依赖仓库
  16. 如何对EXCEL数值做累加
  17. 武汉某GIS企业机试题
  18. ES6字符串、对象、数组不常见但实用的API方法
  19. 大话设计模式之观察者模式
  20. 域服务器修复,重置 Windows 域目录还原(DRSM)密码

热门文章

  1. 51nod1008 N的阶乘 mod P(水题)
  2. 【PAT乙级】1070 结绳 (25 分)
  3. 用思科网络模拟器搭建一个简单的局域网
  4. Spring boot的@PropertySource注解
  5. Freemarker获取pojo属性
  6. 【数据结构-图】3.图的最短路径的几种算法(图解+演绎)
  7. 快速接入 GitHub、QQ 第三方登录方式
  8. 一款高颜值的 SpringBoot+JPA 博客项目
  9. 最牛啤的java,没有之一~
  10. 自定义拦截器和提供的拦截器