`

JAVA内存使用--如何计算一个Java对象占用的字节数

阅读更多
转自(http://blog.csdn.net/kp034/article/details/7077757)
通常,我们谈论的堆内存使用的前提是以“一般情况”为背景的。不包括下面两种情形:


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对象占用字节数的方法,较为详细的分析了Java中各类对象所占用的字节数,需要的朋友可以参考下

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

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

    飞翔的小鸟java源码-java-cheat-sheet:JAVA的所有基本概念

    飞翔的小鸟java源码为什么如此受欢迎 平台无关、OOP、安全性、丰富的 API、IDE、Web、移动、...#####第一个Java程序 public class Main { public static void main ( String [] args ) { System . out . println( " He

    java面试八股文2023完整版110题附带答案

    Java的垃圾回收机制是Java内存管理的一部分,它负责自动回收程序中不再使用的对象所占用的内存。垃圾回收器通过跟踪对象的引用来判断哪些对象不再被使用,当这些对象不再被引用时,垃圾回收器会自动回收这些对象的...

    Java 关键字、标识符、注释、常量与变量、数据类型,算术、赋值、比较、逻辑、位、三元运算符和流程控制、break、continue

    byte占用一个字节,数字大小为-27—27-1 short占用两个字节,数字大小为-215—215-1 int占用四个字节,数字大小为-231—231-1 long占用八个字节,数字大小为-263—263-1 float占用四个字节,数字大小为1.4E-...

    Java程序设计基础:创建String字符串.pptx

    字符串常量:双引号括起来的多个字符组成的序列,每一个字符占2个字节,在内存中共占用2n个字节,n为字符的个数。 例如: " 1234 " , " hello world " ,"A " // 正确 ‘1234’ ,‘abcd’ //错误 创建String对象 ...

    Java八股文的面试题

    垃圾回收(GC): Java通过垃圾回收机制自动管理内存,开发者无需手动释放对象占用的内存。常见的垃圾回收算法包括标记-清除、复制、标记-整理等。 Java集合框架(JCF): Java集合框架提供了一套性能优化的接口和类,...

    java 面试题 总结

    Stateful Session Bean 与 Stateless Session Bean ,这两种的 Session Bean都可以将系统逻辑放在 method之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常来说,一个使用者会有一个相对应...

    JAVA期末考试复习试卷-new.doc

    1、 无论Java源程序包含几个类的定义,若该源程序文件以A.java命名,编译后生成的都只有一个名为A的字节码文件。 ( N ) 2、 Java的各种数据类型所占用的内存长度与具体软硬件环境有关。 ( N) 3、 静态初始化器...

    java堆栈的区别 -- 详解

    一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放,...

    JAVA复习资料

    20、 一个Java Application源程序文件名为MyJavaApplication.java,如果使用Sun公司的Java开发工具JDK编译该源程序文件并使用其虚拟机运算这个程序的字节码文件,应该顺序执行如下两个命令: javac ...

    新版Android开发教程.rar

    Android 是一个专门针对移动设备的软件集,它包括一个操作系统,中间件和一些重要的应用程序。 Beta 版 的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 ...

    阿里面试题-JAVA基础.docx

    JAVA基础 JAVA中的几种基本数据类型是什么,各自占用多少字节。 String类能被继承吗,为什么。 String,Stringbuffer,StringBuilder的区别。 ArrayList和LinkedList有什么区别。

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

    Stateful Session Bean 与 Stateless Session Bean ,这两种的 Session Bean都可以将系统逻辑放在 method之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常来说,一个使用者会有一个相对应...

    java程序设计 游戏程序源码 论文

    2. Java技术提供了一个类库,它使的应用开发商可以创建更为直觉、丰富的用户界面(GUI); 3. Java技术使网络带宽的应用更为有效,因为应用程序可以下载到器件上,并在本地运行,仅仅是在连接到服务器时才会占用网络...

    java课后练习题答案

    Java中定点类型都是有符号数 ,包括byte(字节型) 、short(短整型) 、int(整型)和long(长整型),分别占据1、2、4、8个字节。Java中各种数据类型占用固定的内存长度,与具体的硬件平台无关,体现了Java的跨...

    resin-jvm 调优

    gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存。java语言并不要求jvm有gc,也没有规定gc如何工作。不过常用的jvm都有gc,而且大多数gc都使用类似的算法管理内存和执行收集操作。 在充分理解了...

    黑马程序员 安卓学院 万元哥项目经理 分享220个代码实例

    |--TabHost一个界面显示多Activity |--TextView单行跑马灯效果 |--TextView虚拟获得焦点 |--uploadServlet |--uri之表示资源resource |--ViewPage的使用 |--view中的tag用法之存储对象 |--view常用属性 |--xml常用...

    java餐桌点餐系统源码-encoding:计算机相关名词解释

    这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。 GB-2312 简介: 至于亚洲国家的文字,使用的符号就更多了,汉字就多达10万左右。一个字节只能表示256种符号,...

    Java虚拟机

    5.2.6 不恰当数据结构导致内存占用过大 5.2.7 由Windows虚拟内存导致的长时间停顿 5.3 实战:Eclipse运行速度调优 5.3.1 调优前的程序运行状态 5.3.2 升级JDK 1.6的性能变化及兼容问题 5.3.3 编译时间和类加载...

Global site tag (gtag.js) - Google Analytics