`
zhb8015
  • 浏览: 399416 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
Group-logo
Spring Roo杂谈
浏览量:0
社区版块
存档分类
最新评论

java Object类占用内存大小计算

    博客分类:
  • J2SE
阅读更多
2249人阅读 评论(0) 收藏 举报

在Java中,一个空Object对象的大小是8byte,这个大小只是保存堆中一个没有任何属性的对象的大小。看下面语句:

  1. Object ob = new Object(); 

这样在程序中完成了一个Java对象的生命,但是它所占的空间为:4byte+8byte。4byte是上面部分所说的Java栈中保存引用的所需要的空 间。而那8byte则是Java堆中对象的信息。因为所有的Java非基本类型的对象都需要默认继承Object对象,因此不论什么样的Java对象,其 大小都必须是大于8byte。

有了Object对象的大小,我们就可以计算其他对象的大小了。

  1. Class NewObject {  
  2. int count;  
  3. boolean flag;  
  4. Object ob;  

其大小为:空对象大小(8byte)+int大小(4byte)+Boolean大小(1byte)+空Object引用的大小 (4byte)=17byte。但是因为Java在对对象内存分配时都是以8的整数倍来分,因此大于17byte的最接近8的整数倍的是24,因此此对象 的大小为24byte。

 

 

本文中,我们讨论一个问题:如何计算(或者说,估算)一个Java对象占用的内存数量?

通常,我们谈论的堆内存使用的前提是以“一般情况”为背景的。不包括下面两种情形:

 

  1. 某些情况下,JVM根本就没有把Object放入堆中。例如:原则上讲,一个小的thread-local对象存在于栈中,而不是在堆中。
  2. 被Object占用内存的大小依赖于Object的当前状态。例如:Object的同步锁是否生效,或者,Object是否正在被回收。

我们先来看看在堆中单个的Object长什么样子

 



在堆中,每个对象由四个域构成(A、B、C 和 D),下面我们逐个解释一下:

 

  1. A:对象头,占用很少的字节,表述Object当前状态的信息
  2. B:基本类型域占用的空间(原生域指 int、boolean、short等)
  3. C:引用类型域占用的空间(引用类型域指 其他对象的引用,每个引用占用4个字节)
  4. D:填充物占用的空间(后面说明什么是填充物)

下面我们对A、B、C 和 D 逐一解释

A:对象头

内存中,每个对象占用的总空间不仅包含对象内声明的变量所需要的空间,还包括一些额外信息,比如:对象头 和 填充物。“对象头”的作用是用来记录一个对象的实例名字、ID 和 实例状态(例如,当前实例是否“可到达”,或者当前锁的状态等等)。

在当前的JVM版本中(Hotspot),“对象头”占用的字节数如下:

 

  1. 一个普通对象,占用8 bytes
  2. 数组,占用 12 bytes,包含普通对象的 8 bytes + 4 bytes(数组长度)

B:基本类型

 

boolean、byte 占用 1 byte,char、short 占用 2 bytes,int、float 占用 4 bytes,long、double 占用 8 bytes

C:引用类型

每个引用类型占用 4 bytes

D:填充物

在Hotspot中,每个对象占用的总空间是以8的倍数计算的,对象占用总空间(对象头+声明变量)不足8的倍数时候,自动补齐。而,这些被填充的空间,我们可以称它为“填充物”。我们看下具体实例:

 

  1. 一个空对象(没有声明任何变量)占用 8 bytes -- > 对象头 占用 8 bytes
  2. 只声明了一个boolean类型变量的类,占用 16 bytes --> 对象头(8 bytes) + boolean (1 bytes) + 填充物(7 bytes)
  3. 声明了8个boolean类型变量的类,占用 16 bytes --> 对象头(8 bytes) + boolean (1 bytes) * 8
分享到:
评论

相关推荐

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

    总结起来,Java对象的内存大小计算涉及对象头、实例数据和对齐填充的综合考虑。通过`Unsafe`类或`Instrumentation`接口,我们可以获取这些组成部分的具体大小,进而了解一个Java对象在内存中的占用情况。这样的知识...

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

    在Java编程环境中,了解对象占用的内存大小是优化性能的关键步骤。这可以帮助我们避免内存泄漏,提高应用程序的效率。本文将深入探讨如何统计缓存(尤其是Java对象)所占的内存大小,以及这对理解程序内存消耗的重要...

    测试java对象占用内存大小的例子

    首先,`SizeOf.java`可能是一个实现自定义内存大小计算的类。在Java中,由于垃圾回收机制的存在,直接获取对象的内存占用并不像C++等语言那样简单。通常,我们可以使用一些工具或API来帮助我们。例如,`sun.misc....

    计算一个Java对象占用字节数的方法

    本篇文章将深入探讨如何计算Java对象占用的内存字节数,以及影响这一数值的因素。 首先,Java对象在堆内存中由四个部分组成:对象头(A)、基本类型域(B)、引用类型域(C)和填充物(D)。 **对象头(A)**: ...

    计算java对象的大小的方法

    - **JOL (Java Object Layout)**:由Azul Systems开发的轻量级库,通过反射和JNI技术来计算对象的精确大小。 6. **源码分析**:通过阅读JVM的源码,如OpenJDK,可以更深入地理解对象是如何在内存中布局的。 7. **...

    Java占用内存的研究.pdf

    总结而言,本文档提供了一个深入的分析,帮助读者理解在Java编程中,不同数据类型和结构所占用的内存大小。这不仅可以帮助开发者更好地优化应用程序的内存使用,避免内存泄漏,而且对性能调优也有非常重要的参考价值...

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

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

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

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

    JOL(JAVA OBJECT LAYOUT)工具0.9.zip

    Java对象布局(JOL,Java Object Layout)是一个强大的工具,用于深入理解Java对象在内存中的布局情况。这个工具可以帮助开发者优化内存使用,提高程序性能,尤其是在处理大量对象或高并发场景时。JOL 0.9是其一个...

    测量Java对象大小的demo

    在Java编程中,了解对象的内存占用大小是优化性能、防止内存泄漏以及理解垃圾收集机制的关键。本示例“测量Java对象大小的demo”提供了一种方法,通过使用Java的`java.lang.instrument`包来注入`javaagent`,进而...

    SizeOf_0_2_2.zip_java

    System.out.println("对象占用的内存大小: " + size); } } ``` 在这个例子中,`MyObject`是你自定义的类,`SizeOf.sizeof()`方法则返回该对象在内存中的大小。 总的来说,`SizeOf_0_2_2.zip_java` 提供的工具...

    java基本数据类型字节大小 hibernate运行原理

    下面详细介绍了Java中的基本数据类型以及它们所占用的空间大小: 1. **`byte`**:在Java中,`byte`类型占据1个字节(8位),主要用于存储小范围的整数,例如图像像素值等。其取值范围为-128到127。 2. **`short`**...

    memory-efficient-java-tutorial

    1. **对象的大小计算**: - Java中的对象大小不仅仅包括其本身的数据存储空间,还包括了额外的开销,如对象头(Object Header)等。 - 例如,在一个32位平台上,`Integer` 对象与 `int` 类型相比,其大小比约为 1.33...

    学习java的第一步,就是了解Java虚拟机

    - `object`:一个指向Java对象的引用,占用4字节 - `returnAddress`:一个指向方法返回地址的引用,占用4字节,主要用于实现异常处理中的跳转指令 #### Java虚拟机的结构 1. **方法区**:方法区用来存储每个类的...

    Java内存溢出和内存泄露

    方法区主要用于存储类的定义信息,这部分空间的大小可以通过-XX:PermSize和-XX:MaxPermSize参数来控制。如果方法区溢出,可以通过增加PermSize和MaxPermSize的值来解决问题。 了解内存泄露和内存溢出对于编写高质量...

    java个人总结,觉得还不错

    垃圾回收是Java的另一个核心机制,其主要功能是在程序运行过程中自动回收不再使用的对象所占用的内存空间,从而避免内存泄漏问题。Java的垃圾回收机制主要包括以下几个方面: - **标记-清除算法**:最基础的垃圾回收...

    2014年Java最全面试题以及答案.

    垃圾回收器的基本原理是追踪和识别不再被引用的对象,然后释放这些对象占用的内存。Java虚拟机中垃圾回收不能被强制立即进行,但可以通过System.gc()方法提示虚拟机进行垃圾回收。 36. 静态变量和实例变量的区别? ...

    面试Java程序员最可能遇到的问题考试大全

    堆内存大小可动态扩展,栈内存大小固定。 16. **Static Nested Class和Inner Class的区别**:静态嵌套类与外部类之间没有隐含引用,而内部类有;内部类可以访问外部类的私有成员,静态嵌套类不行。 17. **assert的...

    最新Java面试题

    - **Java的垃圾回收机制**:自动管理内存,通过跟踪对象的引用关系确定不再使用的对象,并释放它们占用的内存空间。常见的垃圾回收算法包括标记-清除、复制算法、标记-整理算法等。 #### 第六章 异常处理 - **`...

Global site tag (gtag.js) - Google Analytics