第十一章:Java对象内存布局和对象头

news2024/11/26 12:36:14

  • 对象内存布局
  • 对象头
    • 运行时元数据
    • 类型指针(类元数据)
  • 实例数据
  • 对齐填充
  • 对象内存布局之JOL 证明
  • GC分代年龄说明
  • 压缩指针参数

对象内存布局

兄弟们感兴趣的话,在 JVM 篇有对 对象的详细介绍:对象实例化内存布局

image-20221130163703189

对象头

运行时元数据

运行时元数据(对象标记)Mark World,包括:

  • 哈希值(HashCode)
  • GC分代年龄
  • 锁状态标志
  • 线程持有的锁
  • 偏向线程ID
  • 翩向时间戳

如果是数组的实例部分还包括数组的长度,

image-20221130165101913

在64位系统中,Mark Word占了8个字节,类型指针占了8个字节,一共是16个字节(不考虑压缩指针)

mark word(64位)分布图,对象布局、GC回收和后面的锁升级就是对象标记MarkWord里面标志位的变化

image-20221130172136799

image-20221130172212088

类型指针(类元数据)

类型指针(类元数据)Klass Pointer

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

image-20221130165911466

实例数据

存放类的属性(Field)数据信息,包括父类的属性信息,这部分内存按4字节对齐。

对齐填充

虚拟机要求对象起始地址必须是8字节的整数倍。
填充数据不是必须存在的,仅仅是为了字节对齐,这部分内存按8字节补充对齐。

class Customer{
    int i ;
    boolean flag;
}

Customer对象头占用16个字节,i 占有 4 个字节,boolean占用 1 个字节,总共 21 个字节,但是 jvm 要求对象占用的字节必须为 8 的倍数,因此填充为 24 个字节。

对象内存布局之JOL 证明

显示的表示对象内存布局

JOL官网

增加依赖:

<!--
官网:http://openjdk.java.net/projects/code-tools/jol/
定位:分析对象在JVM的大小和分布
-->
<dependency>
    <groupId>org.openjdk.jol</groupId>
    <artifactId>jol-core</artifactId>
    <version>0.9</version>
</dependency>

代码:

public class JOLTest {
    public static void main(String[] args) {
        // //VM的细节详细情况
        // System.out.println(VM.current().details());
        // //所有的对象分配的字节都是8的整数倍。
        // System.out.println(VM.current().objectAlignment());

        Object o = new Object();
        System.out.println( ClassLayout.parseInstance(o).toPrintable());
    }
}

输出结果:

image-20221130174331325

  • OFFSET 偏移量,也就是到这个字段位置所占用的byte数
  • SIZE 后面类型的字节大小
  • TYPE 是Class中定义的类型
  • DESCRIPTION DESCRIPTION是类型的描述
  • VALUE VALUE是TYPE在内存中的值

类型指针占用 4 字节,是因为默认开启了 压缩指针。

查看自定义类的内存布局

public class JOLTest {
    public static void main(String[] args) {
        Customer customer = new Customer();
        System.out.println( ClassLayout.parseInstance(customer).toPrintable());
    }
}

class Customer{
    int i ;
    boolean flag ;
}

输出结果:

image-20221130174612375

GC分代年龄说明

GC年龄采用4位bit存储,最大为15,
例如MaxTenuringThreshold参数默认值就是15

如果设置 阈值大于 15,就会报错

image-20221130174916152

image-20221130174945236

压缩指针参数

jvm 中默认开启了 压缩指针。主要是为了节省内存空间

image-20221130175440806

默认开启压缩指针,对象内存情况

对象标记 8 个字节,类型指针 4 个字节,对齐填充 4 个字节 = 16 个字节

image-20221130175605256

关闭压缩指针,对象内存情况-XX:-UseCompressedClassPointers

image-20221130175631164

对象标记 8 个字节,类型指针 8 个字节就对应上了。



各位彭于晏,如有收获点个赞不过分吧…✌✌✌

Alt


gongzhonghao 回复 [JUC] 获取MarkDown笔记

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

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

相关文章

datax-hdfsReader 学习

今天同事遇到了一个问题。 就是hdfsreader->mysqlwriter这种的时候。 有的分区没有数据会报错。 com.tencent.s2.dataingestion.common.exception.DataXException: Code:[HdfsReader-08], Description:[您尝试读取的文件目录为空.]. - 未能找到待读取的文件,请确认您的配…

持久层框架设计实现及MyBatis源码分析 ---- MyBatis基础回顾及高级应用

一、基本应用 基本开发步骤&#xff1a; ① 添加MyBatis的坐标 ② 创建xxx数据表 ③ 编写Xxx实体类 ④ 编写sql映射⽂件XxxMapper.xml ⑤ 编写核⼼配置⽂件SqlMapConfig.xml ⑥ 编写测试类 二、配置文件介绍 1. sql映射配置文件 XxxMapper.xml (1) 基础使用 (2) 动态SQL w…

卡尔曼滤波:The Scaler Kalman Filter常量卡尔曼滤波器

本文是Quantitative Methods and Analysis: Pairs Trading此书的读书笔记。 估计一个常数的通常做法是&#xff0c;做多次测量&#xff08;measurement)&#xff0c;然后使用测量的平均值作为估计值。从统计学的思想上来说&#xff0c;这种做法可以尽量减小估计的误差。这种方…

SpringBoot+Vue实现前后端分离的宠物医院管理系统

文末获取源码 开发语言&#xff1a;Java 使用框架&#xff1a;spring boot 前端技术&#xff1a;JavaScript、Vue.js 、css3 开发工具&#xff1a;IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库&#xff1a;MySQL 5.7/8.0 数据库管理工具&#xff1a;phpstudy/Navicat JD…

Fiddler抓包工具是最强大最好用的 Web 调试工具之一

Fiddler是最强大最好用的Web调试工具之一&#xff0c;它能记录所有客户端和服务器的http和https请求&#xff0c;允许你监视&#xff0c;设置断点&#xff0c;甚至修改输入输出数据. 使用Fiddler无论对开发还是测试来说&#xff0c;都有很大的帮助。 目录 Fiddler的基本介绍 …

【C++11重点语法上】lambda表达式,初始化列表

目录 引子&#xff1a;C11为什么的源来 语法1&#xff1a;初始化列表 1.2.2 多个对象的列表初始化 语法3&#xff1a;默认成员函数控制&#xff08;delete&#xff0c;default&#xff09; 语法4&#xff1a;lambda表达式 引子&#xff1a;C11为什么的源来 在2003年C标准…

22年11月-外包-面试题

目录背景题目Spring怎么解决循环依赖&#xff1f;什么是循环依赖第一种&#xff1a;互相依赖第二种&#xff1a;三者间依赖第三种&#xff1a;自我依赖三级缓存补充&#xff1a;那第三级缓存的作用是什么&#xff1f;补充&#xff1a;Spring 中哪些情况下&#xff0c;不能解决循…

【Hadoop】在云服务器上部署Hadoop2.7.1伪分布式集群

文章目录一、准备Hadoop压缩包并安装1、安装Hadoop&#xff08;1&#xff09;准备好hadoop压缩包&#xff08;2&#xff09;安装hadoop&#xff08;3&#xff09;查看是否安装成功2、将hadoop添加到环境变量&#xff08;1&#xff09;在文件末尾添加以下内容&#xff08;2&…

怎样图片转文字?两分钟让你实现快速转文字

在日常的办公中&#xff0c;我们经常会遇到需要将纸质文件里的文字提取出来&#xff0c;再转换为电子档的情况&#xff0c;如果我们采用手动输入的话&#xff0c;不仅速度太慢&#xff0c;而且还可能因此耽误到后边的工作&#xff0c;是不是已经有小伙伴遇到这种现象&#xff0…

[附源码]Python计算机毕业设计Django房产中介管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

[附源码]计算机毕业设计springboot路政管理信息系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

RFC(Remote function call)

文章目录1 Definition2 Call process3. Communication4 Communication module5 RFC version .6 RFC and Web service7 Remote object maintain8 Call RFC1 Definition 2 Call process 3. Communication 4 Communication module 5 RFC version . 6 RFC and Web service 7 Remote…

mysql的主从复制

文章目录前言主备原理binlog的三种格式循环复制问题主备的搭建总结前言 mysql在日常中的使用是比较多的&#xff0c;大部分可能也都搭建过主从复制&#xff0c;或者集群模式。但是其中的原理不知道大家是否清楚。今天我们主要介绍的就是mysql主从复制的原理。 主备原理 主备…

Transformer对接公司需求的调研报告

1. 结构 从宏观的视角开始 首先将这个模型看成是一个黑箱操作。在机器翻译中&#xff0c;就是输入一种语言&#xff0c;输出另一种语言。 那么拆开这个黑箱&#xff0c;我们可以看到它是由编码组件、解码组件和它们之间的连接组成。 编码组件部分由一堆编码器&#xff08;enc…

Open vSwitch系列之数据结构解析深入分析ofpbuf

上一篇我们分析了hmap&#xff0c;hamp可以说是Open vSwitch中基石结构&#xff0c;很多Open vSwitch中数据结构都依赖hmap。本篇我们来分析一下ofpbuf&#xff0c;这个结构&#xff0c;我们从名字上就可得知&#xff0c;此数据结构用于存储数据的&#xff0c;比如收发OpenFlow…

1543_AURIX_TC275_CPU子系统_CPU内核实现特性

全部学习汇总&#xff1a; GreyZhang/g_TC275: happy hacking for TC275! (github.com) 这个章节看的信息应该是针对内核设计实现上TC275的具体实现特点&#xff0c;应该是覆盖了很多内核中的实施相关的特性的。 1. 在上下文功能支持上&#xff0c;P和更灵活一些。E核只支持DSP…

[附源码]Python计算机毕业设计SSM辽宁科技大学二手车交易平台(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

非常强,批处理框架 Spring Batch 就该这么用!(场景实战)

前言 概念词就不多说了&#xff0c;我简单地介绍下 &#xff0c; spring batch 是一个 方便使用的 较健全的 批处理 框架。 为什么说是方便使用的&#xff0c;因为这是 基于spring的一个框架&#xff0c;接入简单、易理解、流程分明。 为什么说是较健全的&#xff0c; 因为它…

NVIDIA 7th SkyHackathon(八)使用 Flask 与 Vue 开发 Web

1.页面效果 Web 采用 flaskvue 开发&#xff0c;效果图如下 2.后端 import sys import subprocess import os from PIL import Image from datetime import datetime from ASR_metrics import utils as metricsfrom werkzeug.wrappers import Request, Response from …

卡尔曼滤波:过滤随机游走

本文是Quantitative Methods and Analysis: Pairs Trading此书的读书笔记。 我们知道&#xff0c;随机游走序列是到当前时间为止白噪声实现(white noise realization)的简单求和。换句话说&#xff0c;随机游走序列中的对下一个时间点值的估计&#xff08;预测&#xff09;是通…