`
zhaomengsen
  • 浏览: 196867 次
  • 性别: Icon_minigender_1
  • 来自: 河北
社区版块
存档分类
最新评论

如何计算Java对象占用了多少空间?

阅读更多
转载于:http://www.itxuexiwang.com/a/shujukujishu/2016/0206/80.html?1454770807
在Java中没有sizeof运算符,所以没办法知道一个对象到底占用了多大的空间,但是在分配对象的时候会有一些基本的规则,我们根据这些规则大致能判断出来对象大小。



对象头

对象的头部至少有两个WORD,如果是数组的话,那么三个WORD,内容如下:

对象的HashCode,锁信息等

到对象类型数据的指针

数组的长度(如果是数组的话)

规则

首先,任何对象都是8字节对齐,属性按照[long,double]、[int,float]、[char,short]、[byte,boolean]、reference的顺序存放,举个例子:

public class Test {
    byte a;
    int b;
    boolean c;
    long d;
    Object e;
}
如果这个对象的属性按照顺序存放的话,要占用的空间为:head(8) + a(1) + padding(3) + b(4) + c(1) + padding(7) + d(8) + e(4) + padding(4) = 40。但是按照这个规则得到:head(8) + d(8) + b(4) + a(1) + c(1) + padding(2) + e(4) + padding(4) = 32。可以看到节省了不少空间。

在涉及继承关系的时候有一个最基本的规则:首先存放父类中的成员,接着才是子类中的成员,举个例子:

class A {
    long a;
    int b;
    int c;
}
class B extends A {
    long d;
}
这样存放的顺序及占用空间如下:head(8) + a(8) + b(4) + c(4) + d(8) = 32。那如果父类中的属性不够八个字节怎么办?这样就有了新的一条规则:父类中最后一个成员与子类的第一个成员的间隔如果不够4个字节,此时需要扩展到4 个字节的基本单位,举个例子:

class A {
    byte a;
}
class B extends A {
    byte b;
}
那么此时占用的空间如下:head(8) + a(1) + padding(3) + b(1) + padding(3) = 16。显然这种方式比较浪费空间,那么就有了:如果子类的第一个成员是double或者long,并且父类并没有用完8个字节,JVM会破坏规将较小的数 据填充到该空间,举个例子:

class A {
    byte a;
}
class B extends A {
    long b;
    short c;
    byte d;
}
此时占用的空间如下:head(8) + a(1) + padding(3) + c(2) + d(1) + padding(1) + b(8) = 24。
分享到:
评论

相关推荐

    JAVA对象所占内存大小计算例子

    JAVA对象所占内存大小计算例子,博文地址:http://blog.csdn.net/u012787710/article/details/53164226

    Java 对象(数组)占多大空间(几个字节) 手把手做实验

    命令行: java -XX:+PrintCommandLineFlags -version 查看jvm默认参数 分别是 -XX:+UseCompressedOops 和 -XX:+UseCompressedClassPointers 这2个参数都是默认开启(+代表开启,-代表关闭) UseCompressedOops:普通...

    java对象实体类属性字段对比变化过程

    Java对象实体类属性字段对比变化过程是指在一个Java对象实体类的生命周期中,其属性字段的变化情况。这种变化过程通常涉及到对象的创建、使用和销毁等阶段。 在对象的创建阶段,Java对象实体类会根据预设的属性字段...

    Java解析JSON文本,大数据量工具包

    原理:用时创建的规则降低传统解析器一次性将文本转成Java对象而占用大量内存空间,通过注册Filter并判断自己关注的KEY/VALUE来有选择的创建Java对象或JsonLazyer子对象。 使用方法可以查看jar包中的Sample.java示例...

    java语言与面向对象程序设计作业题与参考答案汇编.doc

    JAVA语言与面向对象程序设计作业1 单项选择题 第1题 以下由for语句构成的循环执行的次数是()。 for(int i=0;true;i++); A、有语法错误,不能执行 B、无限次 C、执行1次 D、一次也不执行 答案:B 第2题 以下标识符...

    深入Java核心 Java内存分配原理精讲

    Java内存分配与管理是Java的核心技术之一,今天我们深入Java核心,详细介绍一下Java在内存分配方面的知识。一般Java在内存分配时会涉及到以下区域:  ◆寄存器:我们在程序中无法控制  ◆栈:存放基本类型的...

    常见的java面试题及解答

    当一个对象不再被使用时,JVM会自动回收其占用的内存空间,以释放资源。垃圾回收机制可以有效地避免内存泄漏问题。 Java中什么是反射? 反射在Java中是指在运行时动态地获取类的信息,并可以动态地创建和调用对象。...

    java期末复习第讲面向对象程序设计.pptx

    2023年5月29日 4.1 包 包是由.class文件组成的一个集合 第2页/共41页 java期末复习第讲面向对象程序设计全文共41页,当前为第2页。 2023年5月29日 4.1.1 定义包 构建包语句的语法是: package pkg1[.pkg2[.pkg3…]]...

    java性能分析 jmap jstack

    heap dump:记录某一时刻JVM堆中对象使用情况,哪些对象占用了太多的堆栈空间,来发现导致内存泄露或者可能引起内存泄露的对象。 thread dump:记录java应用中各线程在某一时刻的运行的位置,即执行到哪一个类的哪一...

    JNI技术手册 c/c++调用java

    4) 不知道占用多少空间的buffer,如何传递出去呢? 58 五、 对JAVA传入数据的处理 58 1) 如果传入的是bytearray的话,作如下处理得到buffer: 58 VIII. C/C++调用JAVA类 58 一、 加载虚拟机: 59 二、 获取指定对象...

    java 面试题 总结

    面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。 4. 多态性: 多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    这些对象分别占用不同的内存空间,因此改变其中一个对象的状 态不会影响其它对象的状态 。 3.初始化对象 生成对象的最后一步是执行构造方法,进行初始化。由于对构造方法可以进行重写 ,所以通过给出不同个数或类型...

    超级有影响力霸气的Java面试题大全文档

    面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。 4. 多态性:  多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化...

    JAVA复习资料

    21、在Java的基本数据类型中,char型采用Unicode编码方案,每个Unicode码字符占用 2 字节内存空间,这样,无论是中文字符还是英文字符,每个都是占用2 字节内存空间。 22、在Java程序中定义的类有两种成员: 静态...

    java基础的知识点.docx

    但由于JDK包含了许多与运行无关的内容,占用的空间较大,因此运行普通的Java程序无须安装JDK,而只需要安装JRE即可 Eclipse:一个开放源代码的、基于Java的可扩展开发平台 IntelliJ IDEA:在代码自动提示、代码分析...

    面向对象程序设计

    实验室要求对一台计算机系统的资源占用情况进行实时监控,以了解计算机的运行状态。本课题需要监控的数据如下: (1)cpu 的利用率 (2)内存的可用空间,公共的大小(包括物流内存和虚拟内存) (3)当前进程数...

    java的传值与传引用详解

     简单的说,引用其实就像是一个对象的名字或者别名 (alias),一个对象在内存中会请求一块空间来保存数据,根据对象的大小,它可能需要占用的空间大小也不等。访问对象的时候,我们不会直接是访问对象在内存中的数据...

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    全书分4篇,共24章,其中,第1篇为技能学习篇,主要包括Java Web开发环境、JSP语法、JSP内置对象、Java Bean技术、Servlet技术、EL与JSTL标签库、数据库应用开发、初识Struts2基础、揭密Struts2高级技术、Hib锄劬e...

    基于java的企业级应用开发:JSON数据交互.ppt

    与XML相比,JSON解析速度更快,占用空间更小,且易于阅读和编写,同时也易于机器解析和生成。 JSON有什么特点? 对象结构 1 数组结构 2 JSON有如下两种数据结构: 14.1.1 JSON概述 14.1.1 JSON概述 1.对象结构 在...

Global site tag (gtag.js) - Google Analytics