`
zhaomengsen
  • 浏览: 207528 次
  • 性别: 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对象占用的内存字节数,以及影响这一数值的因素。 首先,Java对象在堆内存中由四个部分组成:对象头(A)、基本类型域(B)、引用类型域(C)和填充物(D)。 **对象头(A)**: ...

    计算java对象大小

    这篇博客文章可能探讨了如何通过不同的工具和技术来估算Java对象在内存中的占用空间。 首先,Java对象的大小不是固定不变的,它取决于对象的类结构,包括类中的属性数量、类型以及虚拟机的实现。每个对象都会有一个...

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

    本文将深入探讨如何计算Java对象所占内存,并通过提供的代码示例进行详细解析。 首先,我们需要理解Java对象内存占用的基本原理。每个Java对象都由三部分组成:对象头(Object Header)、实例数据(Instance Data)...

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

    Java中的对象和数组在内存中的占用空间是由多种因素决定的,包括对象头、实例数据以及对齐填充等。本文将通过实验的方式探讨这些概念,并基于JDK 8 64位及以上版本,尤其是关注`-XX:+UseCompressedOops`和`-XX:+...

    计算对象占用内存空间ObjectSize-master.zip

    "计算对象占用内存空间ObjectSize-master.zip" 提供的工具可能是一个帮助开发者分析和估算对象在内存中占用大小的解决方案。这样的工具对于调试、性能调优以及避免内存泄漏至关重要。 在Java中,对象的内存占用不...

    java 通过sizeOf计算一个对象的大小

    `sizeOf`通常是指用来计算对象在内存中占用空间的一种方法。本篇文章将探讨如何通过Java来实现这样的功能,以及相关知识点。 首先,Java虚拟机(JVM)在运行时为每个对象分配内存,包括实例变量、类信息、对其他...

    java 对象 内存 大小

    当我们谈论“Java对象内存大小”时,我们通常指的是一个Java对象在内存中占据的空间,包括对象头、实例字段以及可能的对齐填充。这个知识点对于开发高效缓存系统尤其重要,因为缓存需要精确管理内存来最大化存储效率...

    统计缓存(java对象所占的内存)大小

    总的来说,理解Java对象在内存中的表示方式和占用空间,结合合适的工具进行监控,是开发高效、稳定的Java应用的基础。通过深入学习这些知识点,开发者可以更好地优化程序,提高系统资源利用率,避免因内存问题导致的...

    Java占用内存的研究.pdf

    一个空的String对象占用28个字节的内存,包含了一个指向字符数组的引用、一个偏移量、一个字符的长度和一个哈希码。当字符串内容非空时,内存占用会增加,因为需要存储字符数据。例如,字符串"ab"会占用28 + 2 * 2 =...

    Java内存使用系列一Java对象的内存占用Java开发J

    这个“Java内存使用系列一Java对象的内存占用”主题旨在深入探讨Java对象在内存中的表现,以及如何有效地管理这些资源。Java开发人员需要理解内存分配、垃圾回收机制以及如何避免内存泄漏,以确保程序的高效运行。 ...

    java字符串内存计算

    而字符数组占用空间的计算则稍微复杂一些。根据字符串长度的不同,其占用空间有所不同。具体来说,每增加一个字符,都会额外占用2个字节的空间(因为Java中的字符类型`char`占用2个字节)。为了方便计算,我们引入了一...

    Java虚拟机和Java程序的生命周期?

    4. **垃圾回收阶段**:当程序不再使用某些对象时,JVM会自动进行垃圾回收,释放不再使用的对象所占用的内存空间。 #### 五、总结 Java虚拟机(JVM)为Java程序提供了一个安全、可移植的运行环境。通过类加载器,...

    Java中对象与引用

    Java 的垃圾回收机制会自动管理内存,回收不再被引用的对象所占用的空间。 #### 五、总结 - **对象**: 是类的实例,具有特定的状态(属性)和行为(方法)。 - **引用**: 是指向对象的变量,通过它可以访问对象的...

    Java对象内存布局 - 小分析

    本篇文章将深入探讨Java对象在JVM内存中的布局,帮助我们理解JVM是如何存储和管理对象的。 首先,我们要知道JVM内存主要分为以下几个区域: 1. **堆内存(Heap)**:这是Java对象的主要存储区域,所有通过`new`...

    Java面向对象编程思想.pdf

    实例化是将类生成多个对象的过程,通过 new 运算符可以为一个类生成多个不同的对象,这些对象占用不同的内存空间,因此改变其中一个对象的状态不会影响到其他对象的状态。 六、继承和多态的关系 继承和多态是 Java...

    java面向对象练习题-经典

    2. 在Java的基本数据类型中,char型采用Unicode编码方案,每个Unicode码占用2字节内存空间。这是因为Unicode编码方案使用双字节来表示每个字符。 3. 设x = 2,则表达式(x + +)/3的值是1。这是因为Java语言的运算符...

    java对象在内存中的结构

    在Java中,程序员通常不需要手动管理内存,因为垃圾收集器会自动检测并释放不再使用的对象占用的内存,这减轻了程序员的工作负担,但同时也可能引入性能上的影响,如垃圾收集的开销。 理解Java对象在内存中的结构...

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

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

Global site tag (gtag.js) - Google Analytics