java JUC并发编程 第九章 对象内存布局与对象头

news2025/2/24 17:31:46

系列文章目录

第一章 java JUC并发编程 Future: link
第二章 java JUC并发编程 多线程锁: link
第三章 java JUC并发编程 中断机制: link
第四章 java JUC并发编程 java内存模型JMM: link
第五章 java JUC并发编程 volatile与JMM: link
第六章 java JUC并发编程 CAS: link
第七章 java JUC并发编程 原子操作类增强: link
第八章 java JUC并发编程 ThreadLocal: link
第九章 java JUC并发编程 对象内存布局与对象头: link


文章目录

  • 系列文章目录
  • 1 概述
    • 1.1 对象的内存布局
      • 1.1.1 对象头
        • 1.1.1.1 对象标记Mark Work
        • 1.1.1.2 类元信息/类型指针
        • 1.1.1.3 对象头大小
      • 1.1.2 实例数据
      • 1.1.3 对齐填充
  • 2 对象头MarkWord
    • 2.1 32位的了解一下
    • 2.2 64位
  • 3 工具展现 Object obj = new Object();
    • 3.1 JOL证明
    • 3.2 代码
    • 3.3 GC年龄采用4位bit存储,最大为15,
      • 3.3.1 实例证明
    • 3.4 压缩指针相关命令说明


1 概述

1.1 对象的内存布局

在这里插入图片描述
在这里插入图片描述
对象内部结构分为:对象头、实例数据、对齐填充(保证8个字节的倍数)
对象头分为对象标记(markOop)和类元信息(klassOop),类元信息存储的是指向改对象类元数据(klass)的首地址。

1.1.1 对象头

1.1.1.1 对象标记Mark Work

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
默认存储对象的HashCode、分代年龄和锁标志位等信息。这些信息都是与对象自身定义无关的数据,所以MarkWord被设计成一个非固定的数据结构以便在极小的空间内存存储尽量多的数据。它会根据对象的状态复用自己的存储空间,也就说在运行期间MarkWord里存储的数据会随着锁标志位的变化而变化

1.1.1.2 类元信息/类型指针

在这里插入图片描述
类型指针是对象头的一部分,主要指向方法区的Customer的Klass类元信息,虚拟机通过这个指针来确定这个对象是哪个类的实例。

1.1.1.3 对象头大小

64位系统中,Mark Word 占了8个字节,类型指针占了8个字节,一共是16个字节。

1.1.2 实例数据

存放类的属性(Field)数据信心,包括父类的属性和信息

1.1.3 对齐填充

虚拟机要求对象起始地址必须是8字节的整数倍。填充数据不是必须存在的,仅仅是为了字节对齐这部分内存按8字节补充对齐。
只有一个对象头的实例对象,16字节(忽略压缩指针的影响),int 类型占4字节,boolean类型占1字节 -->对齐填充,24字节

2 对象头MarkWord

2.1 32位的了解一下

在这里插入图片描述

2.2 64位

在这里插入图片描述
在这里插入图片描述
markword(64位)分布图,对象布局、GC回收和后面的锁升级就是对象标记MarkWord里面标志位的变化

3 工具展现 Object obj = new Object();

3.1 JOL证明

JOL官网:http://openjdk.java.net/projects/code-tools/jol/
图形化以代码的形式展现一个对象在64位的虚拟机里面MarkWord、实例数据栈的大小、对齐填充
在这里插入图片描述
大意是:java对象的展现,是一个非常小巧的java对象的展现工具,可以给你提供分析对象的布局在java的虚拟机里面。
要使用的话需要引入pom
在这里插入图片描述

        <dependency>
            <groupId>org.openjdk.jol</groupId>
            <artifactId>jol-core</artifactId>
            <version>0.9</version>
        </dependency>

3.2 代码

package com.atguigu.springcloud.util.interrup;

import org.openjdk.jol.info.ClassLayout;
import org.openjdk.jol.vm.VM;

public class JOLDemo {
    public static void main(String[] args) {
        //Thread.currentThread
//        System.out.println(VM.current().details());
        /**
         * 上面输出到控制台的内容
         *
         * # Running 64-bit HotSpot VM.                             //64位HotSpot的虚拟机
         * # Using compressed oop with 3-bit shift.                 //压缩的oop
         * # Using compressed klass with 3-bit shift.               //压缩的类型
         * # Objects are 8 bytes aligned.                           //按照8字节对齐
         * # Field sizes by type: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes] //文件大小
         * # Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes] //元素大小
         */

        //对象的对齐数
//        System.out.println(VM.current().objectAlignment());
        /**
         * 上面输出到控制台的内容
         * 8
         */

        Object o = new Object();
        //                              转换这个实例
//        System.out.println(ClassLayout.parseInstance(o).toPrintable());
        /**
         * 上面ClassLayout.parseInstance(o).toPrintable()输出到控制台的内容:
         *
         * java.lang.Object object internals: //内部信息的描述
         *  OFFSET  SIZE   TYPE DESCRIPTION                               VALUE
         *       0(开始)4(结束)  (object header)                           01 00 00 00 (00000001 00000000 00000000 00000000) (1)
         *       4(上4) 4      (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
         *       8     4        (object header)                           e5 01 00 f8 (11100101 00000001 00000000 11111000) (-134217243)
         *      12     4        (loss due to the next object alignment(丢失以后为下个对象进行补齐))
         * Instance size: 16 bytes  //结论:new 一个Object的默认大小就是16bytes
         * Space losses: 0 bytes internal + 4 bytes external = 4 bytes total
         */

        //运行的时候先注释掉Customer中的两个属性
//        Customer c1 = new Customer();
//        System.out.println(ClassLayout.parseInstance(c1).toPrintable());
        /**
         * 上面的ClassLayout.parseInstance(c1).toPrintable()输出结果: 默认也是16字节和上面的object对象一样
         * //对象头Customer的内部结构
         * com.atguigu.springcloud.util.interrup.Customer object internals:
         *  OFFSET  SIZE   TYPE DESCRIPTION                               VALUE
         *       0     4        (object header)                           01 00 00 00 (00000001 00000000 00000000 00000000) (1)
         *       4     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
         *       8     4        (object header)                           43 c1 00 f8 (01000011 11000001 00000000 11111000) (-134168253)
         *      12     4        (loss due to the next object alignment)
         * Instance size: 16 bytes
         * Space losses: 0 bytes internal + 4 bytes external = 4 bytes total
         */

        /**
         * 上面有个问题为什么类型指针是4字节?
         */

        //运行的时候注意需要有int 和 bolean 两个属性
        Customer c2 = new Customer();
        System.out.println(ClassLayout.parseInstance(c2).toPrintable());

        /**
         * 上面输出ClassLayout.parseInstance(c2).toPrintable()运行结果:
         *
         * com.atguigu.springcloud.util.interrup.Customer object internals:
         *  OFFSET  SIZE      TYPE DESCRIPTION                               VALUE
         *       0     4           (object header)                           01 00 00 00 (00000001 00000000 00000000 00000000) (1)
         *       4     4           (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
         *       8     4           (object header)                           43 c1 00 f8 (01000011 11000001 00000000 11111000) (-134168253)
         * //4位                   Customer对象描述                          初始值
         *      12     4       int Customer.id                               0
         * //boolean是 1位                                                  初始值
         *      16     1   boolean Customer.flag                             false
         *           补7位到8的倍数24
         *      17     7           (loss due to the next object alignment)
         * Instance size: 24 bytes
         * Space losses: 0 bytes internal + 7 bytes external = 7 bytes total
         */
    }
}
//只有一个对象头的实例对象,16字节(忽略压缩指针的影响)+4字节+1字节=21字节---->对齐填充,24字节
class Customer{
    //1.第一种情况,只有对象头,没有其他任务数据实例

    //2.第二种情况,int + boolean,满足对齐填充24字节
    int id;
    boolean flag =false;

}
//JOL=java object layOut

在这里插入图片描述
在这里插入图片描述

3.3 GC年龄采用4位bit存储,最大为15,

例如MaxTenuringThreshold参数默认值就是15
为什么是15 因为64位虚拟机表示分代年龄的大小是4bit.所以最大就是2进制的四个1(1111)就是15

在这里插入图片描述

3.3.1 实例证明

1.编辑JVM虚拟机的分代年龄参数:-XX:MaxTenuringThreshold=16
如果不指定上面的的参数默认就是15,必须要小于15,为了演示写成16
在这里插入图片描述
2.运行上面的代码
结果连虚拟机都不能创建
在这里插入图片描述

3.4 压缩指针相关命令说明

打印出启动时的全部参数
java -XX:+PrintCommandLineFlags -version
默认开启压缩说明:
1.初始化堆内存 2.最大堆内存 4.压缩过类型指针(可以解释前面的为什么类型指针为4的问题)
在这里插入图片描述
手动关闭压缩再看看
-XX:-UseCompressedClassPointers
在这里插入图片描述
在这里插入图片描述
没有对齐填充直接到16字节
不管是否压缩指针,只有一个对象头的话都是16字节
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1088045.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

上市一年,市值惨跌八成!大模型救不了智云健康

大数据产业创新服务媒体 ——聚焦数据 改变商业 2022年7月&#xff0c;一站式慢病管理和智慧医疗平台智云健康正式在港交所挂牌上市&#xff0c;发行价30.50港元&#xff0c;对应市值近180亿港元。一年之后&#xff0c;智云健康股价徘徊在6港元左右&#xff0c;对应市值不足40…

【docker - 安装】windows 10 专业版 安装docker,以及 WSL kernel version too low 解决方案

一、开启 Hyper-V 二、下载 docker 三、安装 docker 四、问题 Stage 1&#xff1a;打开 powershell&#xff0c;并执行 Stage 2&#xff1a;下载Linux内核更新包&#xff0c;并安装 Stage 3&#xff1a;将 WSL 2 设置为默认版本 Stage 4&#xff1a;安装所选的 Linux 分…

HarmonyOS应用开发者基础认证【满分答案】

HarmonyOS应用开发者基础认证 一、判断题二、单选题三、多选题 一、判断题 在Column和Row容器组件中&#xff0c;justifyContent用于设置子组件在主轴方向上的对齐格式&#xff0c;alignItems用于设置子组件在交叉轴方向上的对齐格式。&#xff08;正确&#xff09; 所有使用C…

数学基础

线性代数 关键词&#xff1a;线性方程组、矩阵、增广矩阵&#xff08;系数矩阵、常数项矩阵&#xff09;、阶梯型矩阵、行最简矩阵、最简形矩阵、向量系统、向量加法、向量空间、基本单位向量、线性相关、线性无关、Span张成空间、 向量乘法&#xff08;点积、内积、外积、叉积…

易云维®产业电商APP提供适合楼宇自动化应用的HMD/W80系列温湿度传感器资料介绍

维萨拉INTERCAP湿度与温度变送器系列HMD/W80可用于各种楼宇自动化应用中相对湿度与温度的测量。变送器安装简便&#xff0c;工作可靠&#xff0c;并且对维护要求很低。 HMD/W80系列变送器功能全面&#xff0c;包含墙面安装型、管道安装型以及适用于潮湿环境的IP65防护等级变送器…

智能安防监控如何助力汽车4S店信息化精细化管理?最大程度做到降本增效?

汽车4S店做为重要的消费场所&#xff0c;需要给用户提供一个安全舒适的购车环境&#xff0c;另外&#xff0c;很多展车在展厅展示时&#xff0c;容易发生意外&#xff0c;而加大安保人员数量的做法&#xff0c;会提高成本投入&#xff0c;而使用智能视频监控即可解决此类问题&a…

leetcode刷题日记-2.

leetcode第二题 1. 题目2. 参考代码&#xff1a;3. 代码解释 1. 题目 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和…

如何建立企业数字化营销体系?使用数字化营销系统助企业升级?

如何建立企业数字化营销体系&#xff1f;需要从以下几个方面进行考虑和实施&#xff1a; 1. 营销团队的组建。想要更好地开展数字化营销体系的落地&#xff0c;就需要有一个好的数字化落地团队&#xff0c;这个团队不仅具备数字化营销技能和知识&#xff0c;包括对数字分析、数…

课题学习(六)----安装误差校准、实验方法

一、 安装误差校准 1.1 数学模型 在实际情况下&#xff0c;即使努力尝试使三轴加速度计和三轴磁通门正交&#xff0c;也不可能保证坐标轴的正交和安装的准确居中。无论采用何种解法&#xff0c;都会导致最终解的误差。因此&#xff0c;要想提高测量精度&#xff0c;就必须开发…

在Rastion rose中建包并添加类

1、新建包 2、向包中添加类 方法1&#xff1a;在"浏览器"中将已经存在的类拖到包中 方法2&#xff1a;在"浏览器"中新建类 方法&#xff1a;右击包名->new->class 3、设置类在包中的可见性 方法&#xff1a;在浏览器中双击类&#xff0…

【广州华锐互动】VR高层火灾应急疏散演练提供一种无风险的逃生体验

在科技进步的今天&#xff0c;我们已经能够利用虚拟现实&#xff08;VR&#xff09;技术来模拟各种紧急情况&#xff0c;其中就包括高楼火灾逃生。VR高层火灾应急疏散演练系统是一种新兴的技术&#xff0c;它使用虚拟现实环境来模拟高楼火灾的实际情况&#xff0c;为人们提供一…

为什么B2B企业需要CRM系统?如何利用它最大化销售额?

身处 B2B 企业&#xff0c;你是否正在为冗长复杂的销售流程而苦恼&#xff1f;你是否经常感到无法控制来之不易的销售线索&#xff0c;所有的营销努力都付诸东流&#xff1f; 实际上&#xff0c;这些问题正是大多数 B2B 企业面临的共同挑战。但是&#xff0c;为你的B2B业务采用…

UE4和C++ 开发--HUD类

HUD 平视显示器(Head Up Display),简称HUD。在蓝图中是指在屏幕上面绘制的二维物体。 1. 创建HUD 打开蓝图编辑器&#xff0c;创建一个蓝图类&#xff0c;搜索HUD&#xff0c;选择并命名BP_HUD。 2. 开始绘制 打开事件列表&#xff0c;右键搜索 EventReceive Draw HUD。有两…

AP5125 DC-DC降压恒流IC SOT23-6 过认证 9-100V 6A电源驱动线路图

1,产品描述 AP5125 是一款外围电路简单的 Buck 型平均电 流检测模式的 LED 恒流驱动器&#xff0c;适用于 8-100V 电压 范围的非隔离式大功率恒流 LED 驱动领域。芯片采用 固定频率 140kHz 的 PWM 工作模式&#xff0c; 利用平均电 流检测模式&#xff0c;因此具有优异的负载…

【运维笔记】linux同步时间

问题描述 电脑挂机一天&#xff0c;linux时间突然不同步了&#xff0c;需要同步时间 简单直接 systemctl restart ntpd.service &#xff08;其实还有其他很多方法&#xff0c;我先记录这一种&#xff09; 查看时间 timedate 同步前&#xff1a; 同步后

用python 实现采集百度热搜

文章目录 前言用python 实现采集百度热搜1. 实现demo 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话&#xff0c;那欢迎常…

【数据结构与算法】链表的分割

需求分析&#xff1a; 将链表分为两个部分在X前是小于X的&#xff0c;在X后是大于X的。只需要分割不需要排序。 实现思路&#xff1a; 通过从头节点开始遍历&#xff0c;判断小于X的放入一条链表种&#xff0c;大于X的放入另一个链表中&#xff0c;最后将两条链表相连&#xff…

android之TextView自由选择复制

文章目录 前言一、效果图二、实现步骤1.OnSelectListener2.SelectionInfo类3.TextLayoutUtil类4.复制弹框的xml布局5.弹框背景Drawable6.倒三角Drawable7.复制工具类8.调用 总结 前言 根据时代进步&#xff0c;那些干产品的也叼砖起来了&#xff0c;今天就遇到一个需求&#x…

孙哥Netty视频笔记总结

视频在这儿&#xff1a;https://blog.csdn.net/weixin_43996338/article/details/133771464 【视频来源于&#xff1a;B站up主孙帅suns Spring源码视频】【微信号&#xff1a;suns45】 【更多面试资料请加微信号&#xff1a;suns45】 https://flowus.cn/share/f6cd2cbe-627a-43…