对象头包含:

markword(和锁相关的信息)  8字节

class pointer(说明对象属于哪个类),jvm指针八字节,但是默认压缩,所有4个字节

对象体包含:

instance word实例数据(例如int,这就占四个字节,long就占八个)

padding 对齐,整体不能被八整除,就补齐八,为了提高效率

查看对象在内存中的情况,先导入classLayout jar包

下载地址:https://repo.maven.apache.org/maven2/org/openjdk/jol/jol-cli/ 选xxxfull.jar

上图中第一行开始地址是0,大小为4字节的,第二行开始地址是4,大小为4字节的 就是markword

第三行是class pointer(压缩过了,四字节)

因为o没有数据,所以总共大小是8+4=12,补齐之后是16

最后一行就是补齐了四个字节

刚new出来的对象,处于无锁态,没竞争的时候是偏向锁,每次来看一看有没有人用,没有我继续用,有竞争转为自旋锁,即轻量级锁,一直自旋,如果竞争激烈,转为重量级锁。

可以看出,mark word不光有锁信息,还有分代年龄信息

例:老年代很快满了,分代从15改为31可行不?  不可行,分代年龄总共四位,最大是15

上面的hashcode存的是identity hashcode,调用hahcode方法之后才有值,不然里面没值。

偏向锁:54位里面记录了这个线程的id,下次有调用会对比id

轻量级锁的62位,这些竞争的线程每个都有自己的lock Record来抢,通过自旋来抢,谁抢到谁的

因为一直自旋太消耗cpu,所以转到重量级锁

锁消除:

public void add(String s1,String s2){

StringBuffer sb = new StringBuffer();

sb.append().append();

}

append是线程安全的,一直加锁解锁性能低,检测到只在这个方法里用到sb的append,消除锁不用。

对象在内存中的存储布局相关推荐

  1. 对象在内存中的存储基本类型和包装类java类型转换

    对象在内存中的存储 对象头.实例数据和填充数据(为了对齐) 实例变量:存放类的属性数据信息,包括父类的属性信息,如果是数组的实例部分还包括数组的长度,这部分内存按4字节对齐. 填充数据:由于虚拟机要求 ...

  2. Java对象在内存中的存储

    文章目录 1.HotSpot中,对象在内存中分为3块区域: 2.通过一个demo了解这三块区域 3.通过一个demo了解锁标志位 1.HotSpot中,对象在内存中分为3块区域: 对象头 MarkWo ...

  3. JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配

    文章目录 前言 零.排序规范 1.happens-before原则 2.找文档位置 一.一线互联网企业关于对象面试题: (后面回答的就是这几个问题) 二.对象创建过程 三.对象在内存中的存储布局 1. ...

  4. c++全局类对象_C++ 类在内存中的存储方式(一)

    说了这么久的 C++ 终于说到类了,还是从内存出发来讨论一下 C++ 的类在内存中的存储方式(之前写过一篇内存对齐的文章,类同样在一定程度上遵循内存对齐原则,不过比结构体复杂一下) 如有侵权,请联系 ...

  5. python里面的类和对象_Python中类和对象在内存中是如何保存?

    类以及类中的方法在内存中只有一份,而根据类创建的每一个对象都在内存中需要存一份,大致如下图: 如上图所示,根据类创建对象时,对象中除了封装 name 和 age 的值之外,还会保存一个类对象指针,该值 ...

  6. [转载] java对象在内存中的结构

    参考链接: 了解Java中的类和对象 今天看到一个不错的PPT:Build Memory-efficient Java Applications,开篇便提出了一个问题,在Hotspot JVM中,32 ...

  7. java对象的内存结构_Java对象在内存中的结构分析

    问题:在Hotspot JVM中,32位机器下,Integer对象的大小是int的几倍? HotSpot虚拟机中,对象在内存中的布局分为三块区域:对象头.实例数据和对齐填充,其中对象头又分为:Mark ...

  8. java程序在内存中的存储分配

    java程序在内存中的存储分配情况: 一. 堆区: 1.存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指令)  2.jvm只有一个堆区(heap)被所有线 ...

  9. JavaScript中数据在内存中的存储方式

    JavaScript中数据在内存中的存储方式 1.js数据类型分类 简单数据类型:Number.String.Boolean.Undefined.Null 复杂数据类型:Object.Array.Fu ...

最新文章

  1. Android开发--详解ContentProvider/Cursor的使用
  2. C#程序代码行号设置
  3. 使用charles对vue项目进行map Local功能mock数据页面不正常显示
  4. C++语言基础 例程 设计模式简介
  5. 科大星云诗社动态20201129
  6. HTML5-寻路跟踪
  7. MiniDao1.7.1 版本发布,轻量级Java持久化框架
  8. go语言解析html
  9. cdn dashjs_CSS以及JS各种库的在线CDN引用地址
  10. 面试题 03.06. 动物收容所
  11. Swift - 环形进度条(UIActivityIndicatorView)的用法
  12. java多线程总结二(转)
  13. Batch Normalization 算法解析
  14. matplotlib学习
  15. 数据分析及数据挖掘学习路线
  16. 卸载Proteus7进展缓慢、卡顿
  17. 如何生成微信小程序二维码(uniapp开发)
  18. socket 由于目标计算机积极拒绝 无法连接,由于目标计算机积极拒绝,无法连接。 192.168.3.9:8081...
  19. 从自己的角度比较《天书夜读》和《寒江独钓》
  20. UI设计培训分享:UI设计的职业发展路径

热门文章

  1. LeetCode 1120. 子树的最大平均值(DFS自底向上)
  2. [编程启蒙游戏] 1. 猜数字
  3. LeetCode 1419. 数青蛙(脑洞题)
  4. python调用metasploit自动攻击_Python实现远程调用MetaSploit的方法
  5. 交换机的基本配置实验报告_无线网络设计配置即实验报告
  6. Python中对象名称前单下划线和双下划线有啥区别
  7. 数据库实例:用户注册
  8. android p dp5,谷歌释出Android P第5个开发者预览版更新!
  9. MGW——美团点评高性能四层负载均衡
  10. Spring Boot开发Web应用