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               VALUE
  0   8           (object header: mark)     N/A
  8   8           (object header: class)    N/A  -- 这里占了8个字节
 16   8    double A.d1                      N/A
 24   8    double A.d2                      N/A
 32   8      long A.l1                      N/A
 40   8      long A.l2                      N/A
 48   4     float A.f1                      N/A
 52   4     float A.f2                      N/A
 56   4       int A.i1                      N/A
 60   4       int A.i2                      N/A
 64   2      char A.c1                      N/A
 66   2      char A.c2                      N/A
 68   2     short A.s1                      N/A
 70   2     short A.s2                      N/A
 72   1   boolean A.bo1                     N/A
 73   1   boolean A.bo2                     N/A
 74   1      byte A.b1                      N/A
 75   1      byte A.b2                      N/A
 76   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               VALUE
  0   8           (object header: mark)     N/A
  8   4           (object header: class)    N/A  -- 这里占了4个字节
 12   4     float A.f1                      N/A
 16   8    double A.d1                      N/A
 24   8    double A.d2                      N/A
 32   8      long A.l1                      N/A
 40   8      long A.l2                      N/A
 48   4     float A.f2                      N/A
 52   4       int A.i1                      N/A
 56   4       int A.i2                      N/A
 60   2      char A.c1                      N/A
 62   2      char A.c2                      N/A
 64   2     short A.s1                      N/A
 66   2     short A.s2                      N/A
 68   1   boolean A.bo1                     N/A
 69   1   boolean A.bo2                     N/A
 70   1      byte A.b1                      N/A
 71   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               VALUE
  0   8                       (object header: mark)     N/A
  8   4                       (object header: class)    N/A
 12   4     java.lang.Boolean B.bo1                     N/A
 16   4        java.lang.Byte B.b1                      N/A
 20   4   java.lang.Character B.c1                      N/A
 24   4      java.lang.Double B.d1                      N/A
 28   4       java.lang.Float B.f1                      N/A
 32   4     java.lang.Integer B.i1                      N/A
 36   4        java.lang.Long B.l1                      N/A
 40   4       java.lang.Short B.s1                      N/A
 44   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               VALUE
  0   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               VALUE
  0   8          (object header: mark)     N/A
  8   4          (object header: class)    N/A
 12   4      int GrandFather.age           N/A
 16   8   double GrandFather.money         N/A
 24   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               VALUE
  0   8          (object header: mark)     N/A
  8   4          (object header: class)    N/A
 12   4      int GrandFather.age           N/A
 16   8   double GrandFather.money         N/A
 24   8   double GrandFather.bbb           N/A
 32   8   double Father.money              N/A
 40   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               VALUE
  0   8          (object header: mark)     N/A
  8   4          (object header: class)    N/A
 12   4      int GrandFather.age           N/A
 16   8   double GrandFather.money         N/A
 24   8   double GrandFather.bbb           N/A
 32   8   double Father.money              N/A
 40   8   double Father.ddd                N/A
 48   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                      VALUE
  0   8                                 (object header: mark)            N/A
  8   4                                 (object header: class)           N/A
 12   4                java.lang.Object Throwable.backtrace              N/A
 16   4                java.lang.String Throwable.detailMessage          N/A
 20   4             java.lang.Throwable Throwable.cause                  N/A
 24   4   java.lang.StackTraceElement[] Throwable.stackTrace             N/A
 28   4                  java.util.List Throwable.suppressedExceptions   N/A
 32   4                             int Throwable.depth                  N/A
 36   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                    VALUE
  0   8                                                   (object header: mark)          N/A
  8   4                                                   (object header: class)         N/A
 12   4                     java.lang.reflect.Constructor Class.cachedConstructor        N/A
 16   4                                   java.lang.Class Class.newInstanceCallerCache   N/A
 20   4                                  java.lang.String Class.name                     N/A
 24   4                                  java.lang.Module Class.module                   N/A
 28   4                                                   (alignment/padding gap)        
 32   4                                  java.lang.String Class.packageName              N/A
 36   4                                   java.lang.Class Class.componentType            N/A
 40   4                       java.lang.ref.SoftReference Class.reflectionData           N/A
 44   4   sun.reflect.generics.repository.ClassRepository Class.genericInfo              N/A
 48   4                                java.lang.Object[] Class.enumConstants            N/A
 52   4                                     java.util.Map Class.enumConstantDirectory    N/A
 56   4                    java.lang.Class.AnnotationData Class.annotationData           N/A
 60   4             sun.reflect.annotation.AnnotationType Class.annotationType           N/A
 64   4                java.lang.ClassValue.ClassValueMap Class.classValueMap            N/A
 68  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 注解

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2022年09月 Python(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 下列不是评判一个算法优劣的标准是?( ) A: 时间复杂度 B: 空间复杂度 C: 难易度 D: 健壮性 答案:C 评价算法的优劣是:时间复杂度,空间复杂度,健壮性,正确性,可读性。因此选…

一周成功拿下4个offer的软件测试面试题,面试必看系列

前言&#xff1a; 压到就是赚到&#xff0c;面试通过的机率就更大&#xff0c;干就完了铁子 【文章末尾给大家留下了大量的福利】 ​编辑 1、什么是兼容性测试&#xff1f;兼容性测试侧重哪些方面&#xff1f; 参考答案&#xff1a; 兼容测试主要是检查软件在不同的硬件平…

el-table 多表格弹窗嵌套数据显示异常错乱问题

1、业务背景 使用vueelement开发报表功能时&#xff0c;需要列表上某列的超链接按钮弹窗展示&#xff0c;在弹窗的el-table列表某列中再次使用超链接按钮点开弹窗&#xff0c;以此类推多表格弹窗嵌套&#xff0c;本文以弹窗两次为例 最终效果如下示例页面 2、具体实现和问题…

【狂神说Java】Swagger + 任务

✅作者简介&#xff1a;CSDN内容合伙人、信息安全专业在校大学生&#x1f3c6; &#x1f525;系列专栏 &#xff1a;狂神说Java &#x1f4c3;新人博主 &#xff1a;欢迎点赞收藏关注&#xff0c;会回访&#xff01; &#x1f4ac;舞台再大&#xff0c;你不上台&#xff0c;永远…

重庆市5米数字高程(DEM)数据

重庆位于中国西南部、长江上游地区&#xff0c;地跨东经10511~11011、北纬2810~3213之间的青藏高原与长江中下游平原的过渡地带。东邻湖北、湖南&#xff0c;南靠贵州&#xff0c;西接四川&#xff0c;北连陕西&#xff1b;辖区东西长470千米&#xff0c;南北宽450千米&#xf…

uni-app——項目day01

配置uni-app開發環境 uni-app快速上手 | uni-app官网 创建项目 图中四个划线就是要配置的地方. 选择vue2还是vue3看个人选择。 目录结构 但是现在新版本创建的项目已经没有components目录了&#xff0c;需要自己创建。 项目运行到微信开发者工具 使用git管理项目 node-mod…

【神印王座】林鑫和李馨甜蜜接吻,团灭七阶恶魔,温馨结尾

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析国漫资讯。 深度爆料&#xff0c;《神印王座》80话最新剧情解析。有关李馨与林鑫的爱情故事源于一场争执。那时&#xff0c;两人都年轻气盛&#xff0c;不肯向对方低头。但是&#xff0c;经过一段时间的相处&#xff0c;…

ARM day4

LED灯亮灭控制 .text .global _start _start: 1ldr r0,0x50000a28ldr r1,[r0]orr r1,r1,#(0x3<<4)str r1,[r0] 2ldr r0,0x50006000ldr r1,[r0]bic r1,r1,#(0x3<<20)orr r1,r1,#(0x1<<20)bic r1,r1,#(0x3<<16)orr r1,r1,#(0x1<<16)str r1,[r0]…

java语法:继承与多态

导言: 在Java中&#xff0c;继承和多态是面向对象编程的两个重要概念&#xff0c;它们允许我们创建更加灵活和可扩展的代码。本文主要对继承和多态的语法和一些细节做一个介绍和解释。 目录 导言: 正文&#xff1a; 一.继承 1. 基本语法 2. 继承的特点 3.子类中访问父类…

补坑:Java的字符串String类(1)

常用方法 字符串构造 来看看源码里面String的构造方法 普通字符串 //"hello" 是字符串常量&#xff0c;没有\0标记结尾String str "hello";System.out.println(str);//helloString str2 new String();System.out.println(str2);//没有输出String str3…

“三位一体”超级混沌工程主要特点及功能

“三位一体”超级混沌工程X-Chaos主要包括基础故障编排、业务场景故障编排、演练场景编排、故障库管理、演练场景管理、演练计划管理、演练观测和演练报告等模块&#xff0c;支持对传统架构、云环境以及国产化基础环境的IT系统进行故障演练。本文将介绍混沌工程主要特点及主要功…

归并分治 笔记

归并分治 前置知识&#xff1a;讲解021-归并排序 原理&#xff1a; (1&#xff09;思考一个问题在大范围上的答案&#xff0c;是否等于&#xff0c;左部分的答案 右部分的答案 跨越左右产生的答案(2&#xff09;计算“跨越左右产生的答案”时&#xff0c;如果加上左、右各自…

GeoGebra:数学动画制作工具重磅来袭

【线性代数】线性代数可视化工具&#xff1a;manim manim是之前我跟大家分享的一个线性代数动画制作工具。 但我之前的描述有些许偏差&#xff0c;这里要更正一下&#xff0c;manim不仅限于制作线性代数动画&#xff0c;也可以制作数学其他学科的动画&#xff0c;例如微积分&…

Selenium是什么,带你了解自动化测试的神奇之处

一、使用测试工具 工欲善其事&#xff0c;必先利其器。在开始具体的自动化测试之前&#xff0c;我们需要做好更多的准备&#xff0c;包括以下几个方面&#xff1a; 认识自动化测试 准备自动化测试工具 使用有效的方式 针对具体的测试对象 接下来的第一部分内容&#xff0c;我…

JavaScript如何实现钟表效果,时分秒针指向当前时间,并显示当前年月日,及2024春节倒计时,源码奉上

本篇有运用jQuery&#xff0c;记得引入jQuery库&#xff0c;否则不会执行的喔~ <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title></title> <meta name"chenc" content"Runoob"> <met…

人工智能中的基础之一——Python

Python作为一种简洁、易学、功能丰富的高级编程语言&#xff0c;被广泛应用于数据分析、人工智能、Web开发等各个领域。本文将介绍Python的基础语法和使用&#xff0c;帮助读者快速上手Python编程。 一、Python基础语法 1. 变量和数据类型 在Python中&#xff0c;可以使用变…

C#,Python实践,用CodeFormer实现人脸重建(Face Restoration),模糊清晰、划痕修复及黑白上色

无论是自己、家人或是朋友、客户的照片&#xff0c;免不了有些是黑白的、被污损的、模糊的&#xff0c;总想着修复一下。作为一个程序员 或者 程序员的家属&#xff0c;当然都有责任满足他们的需求、实现他们的想法。除了这个&#xff0c;学习了本文的成果&#xff0c;或许你还…

【Unity程序小技巧】如何消除多次Destory带来的性能消耗

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

Linux学习第36天:Linux RTC 驱动实验:时间是一条流淌的河

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 RTC就是实时时钟。 本笔记主要学习Linux RTC驱动试验&#xff0c;主要内容包括Linux内核RTC驱动简介、I.MX6U内部RTC分析、RTC时间查看与设置。因为Linux内核已经…

Docker - 常用命令

Docker - 常用命令 帮助命令 docker version # 查看docker版本信息 docker info # 显示docker的系统信息&#xff0c;包括镜像和容器的数量 docker 命令 --help # 帮助命令官网帮助文档&#xff1a;https://docs.docker.com/engine/reference/commandline/cli/ 镜像…