JAVA对象大小的获取

1. Java 对象的内存布局

Java的实例对象、数组对象在内存中的组成包括如下三部分:对象头Hearder、实例数据、内存填充。示意图如下所示
在这里插入图片描述

  • 对象头
    其主要包括两部分数据:Mark Word、Class对象指针。特别地对于数组对象而言,其还包括了数组长度数据。在64位的HotSpot虚拟机下,Mark Word占8个字节,其记录了Hash Code、GC信息、锁信息等相关信息;而Class对象指针则指向该实例的Class对象,在开启指针压缩的情况下占用4个字节,否则占8个字节;如果其是一个数组对象,则还需要4个字节用于记录数组长度信息。这里列出64位HotSpot虚拟机Mark Word的具体含义,以供参考。需要注意的是在下图的Mark Word中,左侧为高字节,右侧为低字节
    在这里插入图片描述

  • 实例数据
    用于存放该对象的实例数据

  • 内存填充
    64位的HotSpot要求Java对象地址按8字节对齐,即每个对象所占内存的字节数必须是8字节的整数倍。因此Java对象需要通过内存填充来满足对齐要求

注:

在64位的HotSpot虚拟机下,类型指针、引用类型需要占8个字节。显然这大大增加了内存的消耗和占用。为此从JDK 1.6开始,64位的JVM支持UseCompressedOops选项。其可对OOP(Ordinary Object Pointer,普通对象指针)进行压缩,使其只占用4个字节,以达到节约内存的目的。在JDK 8下,该选项默认启用。当然也可以通过添加JVM参数来显式进行配置

-XX:+UseCompressedOops  // 开启指针压缩
-XX:-UseCompressedOops  // 关闭指针压缩

2. 代码示例获取Java对象的大小

引入maven依赖

<dependency><groupId>org.openjdk.jol</groupId><artifactId>jol-core</artifactId><version>0.17</version><scope>compile</scope>
</dependency>

2.1 基本类型的大小

package com.zishi.jvm.jol.ab;
public class A {boolean bo1;boolean bo2;byte b1;byte b2;char c1;char c2;double d1;double d2;float f1;float f2;int i1;int i2;long l1;long l2;short s1;short s2;
}
public static void main(String[] args) {System.out.println(ClassLayout.parseClass(A.class).toPrintable());
}

关闭压缩的结果如下:

com.zishi.jvm.jol.ab.A object internals:
OFF  SZ      TYPE DESCRIPTION               VALUE0   8           (object header: mark)     N/A8   8           (object header: class)    N/A  -- 这里占了8个字节16   8    double A.d1                      N/A24   8    double A.d2                      N/A32   8      long A.l1                      N/A40   8      long A.l2                      N/A48   4     float A.f1                      N/A52   4     float A.f2                      N/A56   4       int A.i1                      N/A60   4       int A.i2                      N/A64   2      char A.c1                      N/A66   2      char A.c2                      N/A68   2     short A.s1                      N/A70   2     short A.s2                      N/A72   1   boolean A.bo1                     N/A73   1   boolean A.bo2                     N/A74   1      byte A.b1                      N/A75   1      byte A.b2                      N/A76   4           (object alignment gap)    -- 对齐了4个字节
Instance size: 80 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

开启压缩的结果如下:

com.zishi.jvm.jol.ab.A object internals:
OFF  SZ      TYPE DESCRIPTION               VALUE0   8           (object header: mark)     N/A8   4           (object header: class)    N/A  -- 这里占了4个字节12   4     float A.f1                      N/A16   8    double A.d1                      N/A24   8    double A.d2                      N/A32   8      long A.l1                      N/A40   8      long A.l2                      N/A48   4     float A.f2                      N/A52   4       int A.i1                      N/A56   4       int A.i2                      N/A60   2      char A.c1                      N/A62   2      char A.c2                      N/A64   2     short A.s1                      N/A66   2     short A.s2                      N/A68   1   boolean A.bo1                     N/A69   1   boolean A.bo2                     N/A70   1      byte A.b1                      N/A71   1      byte A.b2                      N/A
Instance size: 72 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total

注:以下代码均开启压缩

2.2 包装类型的大小

public class B {Boolean bo1;Byte b1;Character c1;Double d1;Float f1;Integer i1;Long l1;Short s1;
}

结果如下:

com.zishi.jvm.jol.ab.B object internals:
OFF  SZ                  TYPE DESCRIPTION               VALUE0   8                       (object header: mark)     N/A8   4                       (object header: class)    N/A12   4     java.lang.Boolean B.bo1                     N/A16   4        java.lang.Byte B.b1                      N/A20   4   java.lang.Character B.c1                      N/A24   4      java.lang.Double B.d1                      N/A28   4       java.lang.Float B.f1                      N/A32   4     java.lang.Integer B.i1                      N/A36   4        java.lang.Long B.l1                      N/A40   4       java.lang.Short B.s1                      N/A44   4                       (object alignment gap)    
Instance size: 48 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

3.3 数组对象的大小(int[] 为例说明)

    public static void main(String[] args) {int[] array = new int[3];array[0] = 11;array[1] = 22;array[2] = 33;System.out.println( ClassLayout.parseInstance(array).toPrintable() );}

结果如下:

[I object internals:
OFF  SZ   TYPE DESCRIPTION               VALUE0   8        (object header: mark)     0x0000000000000001 (non-biasable; age: 0) --对象头8   4        (object header: class)    0x00000c10 -- 对象字节头信息12   4        (array length)            3  --数组的长度16  12    int [I.<elements>             N/A -- 数组元素占的空间28   4        (object alignment gap)    -- 对齐
Instance size: 32 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

数组的对象头里面包含了数组的长度,占4个字节。

3.3 继承

public class GrandFather {private int age;protected double money;public double bbb;
}
public class Son extends Father {private double rrr;
}
public class Father extends GrandFather {protected double money;protected double ddd;
}

main方法:

public static void main(String[] args) {System.out.println(ClassLayout.parseClass(GrandFather.class).toPrintable());System.out.println("-----------------------------------------------------------------");System.out.println(ClassLayout.parseClass(Father.class).toPrintable());System.out.println("-----------------------------------------------------------------");System.out.println(ClassLayout.parseClass(Son.class).toPrintable());
}
com.zishi.jvm.jol.ab.GrandFather object internals:
OFF  SZ     TYPE DESCRIPTION               VALUE0   8          (object header: mark)     N/A8   4          (object header: class)    N/A12   4      int GrandFather.age           N/A16   8   double GrandFather.money         N/A24   8   double GrandFather.bbb           N/A
Instance size: 32 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total-----------------------------------------------------------------
com.zishi.jvm.jol.ab.Father object internals:
OFF  SZ     TYPE DESCRIPTION               VALUE0   8          (object header: mark)     N/A8   4          (object header: class)    N/A12   4      int GrandFather.age           N/A16   8   double GrandFather.money         N/A24   8   double GrandFather.bbb           N/A32   8   double Father.money              N/A40   8   double Father.ddd                N/A
Instance size: 48 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total-----------------------------------------------------------------
com.zishi.jvm.jol.ab.Son object internals:
OFF  SZ     TYPE DESCRIPTION               VALUE0   8          (object header: mark)     N/A8   4          (object header: class)    N/A12   4      int GrandFather.age           N/A16   8   double GrandFather.money         N/A24   8   double GrandFather.bbb           N/A32   8   double Father.money              N/A40   8   double Father.ddd                N/A48   8   double Son.rrr                   N/A
Instance size: 56 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total

3.4 异常

    public static void main(String[] args) {System.out.println(ClassLayout.parseClass(Throwable.class).toPrintable());}

结果如下:

java.lang.Throwable object internals:
OFF  SZ                            TYPE DESCRIPTION                      VALUE0   8                                 (object header: mark)            N/A8   4                                 (object header: class)           N/A12   4                java.lang.Object Throwable.backtrace              N/A16   4                java.lang.String Throwable.detailMessage          N/A20   4             java.lang.Throwable Throwable.cause                  N/A24   4   java.lang.StackTraceElement[] Throwable.stackTrace             N/A28   4                  java.util.List Throwable.suppressedExceptions   N/A32   4                             int Throwable.depth                  N/A36   4                                 (object alignment gap)           
Instance size: 40 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

3.5 Class

public static void main(String[] args) {System.out.println(ClassLayout.parseClass(Class.class).toPrintable());
}

结果如下:

java.lang.Class object internals:
OFF  SZ                                              TYPE DESCRIPTION                    VALUE0   8                                                   (object header: mark)          N/A8   4                                                   (object header: class)         N/A12   4                     java.lang.reflect.Constructor Class.cachedConstructor        N/A16   4                                   java.lang.Class Class.newInstanceCallerCache   N/A20   4                                  java.lang.String Class.name                     N/A24   4                                  java.lang.Module Class.module                   N/A28   4                                                   (alignment/padding gap)        32   4                                  java.lang.String Class.packageName              N/A36   4                                   java.lang.Class Class.componentType            N/A40   4                       java.lang.ref.SoftReference Class.reflectionData           N/A44   4   sun.reflect.generics.repository.ClassRepository Class.genericInfo              N/A48   4                                java.lang.Object[] Class.enumConstants            N/A52   4                                     java.util.Map Class.enumConstantDirectory    N/A56   4                    java.lang.Class.AnnotationData Class.annotationData           N/A60   4             sun.reflect.annotation.AnnotationType Class.annotationType           N/A64   4                java.lang.ClassValue.ClassValueMap Class.classValueMap            N/A68  28                                                   (alignment/padding gap)        96   4                                               int Class.classRedefinedCount      N/A
100   4                                                   (object alignment gap)         
Instance size: 104 bytes
Space losses: 32 bytes internal + 4 bytes external = 36 bytes total

3.6 注解

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ionic 模块组件的理解

1 Ionic4.x 文件分析 1.1 app.module.ts 分析 Ionic 是一个基于 Angular 的移动应用开发框架&#xff0c;能帮助开发者使用 Web 技术&#xff08;HTML5、CSS3、JavaScript&#xff09;创建跨平台的应用程序。在 Ionic 应用程序中&#xff0c;app.module.ts 文件是整个应用程序的…

Python小试牛刀:GUI(图形界面)实现计算器UI界面(三)

上一篇&#xff1a;Python小试牛刀&#xff1a;GUI&#xff08;图形界面&#xff09;实现计算器UI界面(二)-CSDN博客 回顾前两篇文章&#xff0c;第一篇文章主要实现了计算器UI界面如何布局&#xff0c;以及简单概述Python常用的GUI库。第二篇文章主要实现了计算器UI界面按钮组…

Wpf 使用 Prism 实战开发Day04

一.菜单导航实现 1.首先创建出所有的页面(View)及对应的页面逻辑处理类(ViewModel) IndexView(首页)-----------------IndexViewModelToDoView(待办事项)------------ToDoViewModelMemoView(忘备录)--------------MemoViewModelSettingsView(设置)--------------SettingsViewMo…

使用Java AOP实现面向切面编程

简介 面向切面编程&#xff08;AOP&#xff09;是一种编程思想&#xff0c;它将程序中的关注点分离&#xff0c;使得开发人员可以专注于核心业务逻辑而不必过多关注横切关注点。Java中的AOP可以通过使用AspectJ等框架来实现&#xff0c;本文将介绍如何使用Java AOP实现切面编程…

计算机毕设 基于大数据的服务器数据分析与可视化系统 -python 可视化 大数据

文章目录 0 前言1 课题背景2 实现效果3 数据收集分析过程**总体框架图****kafka 创建日志主题****flume 收集日志写到 kafka****python 读取 kafka 实时处理****数据分析可视化** 4 Flask框架5 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&a…

地址的层次性

地址的层次性 当地址总数并不是很多的情况下&#xff0c;有了唯一地址就可以定位相互通信的主体。然而当地址的总数越来越多时&#xff0c;如何高效地从中找出通信的目标地址将成为一个重要的问题。为此人们发现地址除了具有唯一性还需要具有层次性。其实&#xff0c;在使用电…

Elasticsearch:RAG vs Fine-tunning (大语言模型微调)

如果你对 RAG 还不是很熟悉的话&#xff0c;请阅读之前的文章 “Elasticsearch&#xff1a;什么是检索增强生成 - RAG&#xff1f;”。你可以阅读文章 “Elasticsearch&#xff1a;在你的数据上训练大型语言模型 (LLM)” 来了解更多关于如何训练你的模型。在今天的文章中&#…

MFC 基础篇(一)

目录 一.SDK编程 二.为什么要学MFC&#xff1f; 三.MFC能做什么&#xff1f; 四.MFC开发环境搭建 五.MFC项目创建 六.消息映射机制 一.SDK编程 Application Programming Interface 应用程序编程接口。 Software Development Kit 软件开发工具包&#xff0c;一般会包括A…

【LeetCode】每日一题 2023_11_6 最大单词长度乘积

文章目录 刷题前唠嗑题目&#xff1a;最大单词长度乘积题目描述代码与解题思路偷看大佬题解 结语 刷题前唠嗑 LeetCode? 启动&#xff01;&#xff01;&#xff01; 题目&#xff1a;最大单词长度乘积 题目链接&#xff1a;318. 最大单词长度乘积 题目描述 代码与解题思路…

飞书开发学习笔记(二)-云文档简单开发练习

飞书开发学习笔记(二)-云文档简单开发练习 一.云文档飞书开发环境API 首先还是进入开放平台 飞书开放平台&#xff1a;https://open.feishu.cn/app?langzh-CN 云文档相关API都在“云文档”目录中&#xff0c;之下又有"云空间",“文档”&#xff0c;“电子表格”&a…

java智能在线考试系统源码 基于SpringBoot+Vue开发

java智能在线考试系统源码 基于SpringBootVue开发 环境介绍 语言环境&#xff1a;Java: jdk1.8 数据库&#xff1a;Mysql: mysql5.7 应用服务器&#xff1a;Tomcat: tomcat8.5.31 开发工具&#xff1a;IDEA或eclipse 开发技术&#xff1a;SpringbootVue 项目简介&…

手拿5份offer,最高18k! 95后艺术生转行后台网优,这个火花有点大!

当艺术生碰上理工科&#xff0c;会有怎样的火花&#xff1f;在大众的刻板认知里&#xff0c;艺术和理工科就像两条很少重合的平行线&#xff0c;双方从业者在自己的行业下按部就班&#xff0c;规划未来。 来自东北长春的W同学却打破了常人的认知&#xff0c;身为美术老师的他却…

观察者模式——解决解耦的钥匙

● 观察者模式介绍 观察者模式是一个使用频率非常高的模式&#xff0c;它最常用的地方是GUI系统、订阅——发布系统。因为这个模式的一个重要作用就是解耦&#xff0c;将被观察者和观察者解耦&#xff0c;使得它们之间依赖性更小&#xff0c;甚至做到毫无依赖。以CUI系统来说&a…

Unisat的核心成员神秘失踪两个月后,CHAX横空出世

在这个快速变化的数字世界中&#xff0c;故事似乎总是在不断上演。最近&#xff0c;一则消息在加密货币社区中引起了轩然大波&#xff1a;Unisat的核心成员神秘失踪两个月后&#xff0c;CHAX横空出世&#xff0c;带来了一股新的风潮。 受够了BRC20-Swap多次难产&#xff0c;落地…

2023年11月5日网规考试备忘

早上题目回忆&#xff1a; pki体系 ipsec&#xff0c;交换安全&#xff08;流量抑制&#xff09; aohdlc bob metclaf —ethernet pon tcp三次握手 OSPF lsa&#xff1f;交换机组ospf配置问题&#xff0c;ping网关可通&#xff0c;AB不通 raid6 300G*8 网络利用率 停等协议10…

VUE多语言i18n配置

1、i18n官网 格式化 | Vue I18n 2、安装i18n 8---指版本号 // vue2必须安装8版本的i18n包&#xff0c;vue3必须安装9版本的i18n包。 npm i vue-i18n8 3、卸载i18n npm uninstall vue-i18n 4、安装 js-cookie npm install vue-cookies --save 5、代码 5.1 main.js /…

ActiveMQ、RabbitMQ、RocketMQ、Kafka介绍

一、消息中间件的使用场景 消息中间件的使用场景总结就是六个字&#xff1a;解耦、异步、削峰 1.解耦 如果我方系统A要与三方B系统进行数据对接&#xff0c;推送系统人员信息&#xff0c;通常我们会使用接口开发来进行。但是如果运维期间B系统进行了调整&#xff0c;或者推送过…

Java后端开发——JDBC组件

JDBC&#xff08;Java Database Connectivity&#xff09;是Java SE平台的一种标准API&#xff0c;它提供了一种标准的方法来访问关系型数据库&#xff0c;使得Java程序能够与各种不同的数据库进行交互&#xff0c;这篇文章我们来进行实验体验一下。 自定义JDBC连接工具类 1.编…

stm32整理(三)ADC

1 ADC简介 1.1 ADC 简介 12 位 ADC 是逐次趋近型模数转换器。它具有多达 19 个复用通道&#xff0c;可测量来自 16 个外部 源、两个内部源和 VBAT 通道的信号。这些通道的 A/D 转换可在单次、连续、扫描或不连续 采样模式下进行。ADC 的结果存储在一个左对齐或右对齐的 16 位…

6款优质办公软件,个个都是效率神器,可免费使用

今天给大家分享6款优质的办公软件&#xff0c;这些软件不仅功能强大&#xff0c;还可以免费使用&#xff0c;让你高效完成工作。 Todo清单——待办事项软件 Todo清单是一款强大的跨平台待办事项和时间管理软件。它可以帮助用户记录、跟踪和完成待办事项。通过创建清单&#xff…