读书人

java对象内存储器占用情况分析

发布时间: 2012-11-03 10:57:42 作者: rapoo

java对象内存占用情况分析

一个对象实例占用了多少字节,消耗了多少内存?这样的问题在c或c++里使用sizeof()方法就可以得到明确答案,在java里好像没有这样的方法(java一样可以实现),不过通过jmap工具倒是可以查看出一个对象的占用内存的大小,这里介绍一种通过分析java代码计算内存使用情况的方法。

注意,一下讨论的情况都是基于32位机,不适用用64位机,JVM是sun的HotSpot,不同的虚拟机实现可能会不同

?

规则一:每个对象被按照8bytes粒度对齐(数组除外)

?

在jvm中每个对象(数组除外)都有一个头,这个头有两个字,第一个字存储的时对象的一些标志位信息,例如:锁标志位、经历了几次gc等信息,第二个字是一个引用,指向了这个类的类信息。这里jvm给这两个字留了8个字节的空间(这个为啥用8个字节空间不是很清楚,一个字即两个字节,我一直认为4个字节就够了)

按规则一:new Object();这个Object实例就占用了8个字节

?

规则二:为类属性分配存储空间时不是按照类中定义的属性顺序,而是按如下的顺序:

? ? ? ? ? ? 1、double\long;----8bytes

? ? ? ? ? ? 2、int\float;----4bytes

? ? ? ? ? ? 3、char\short;----2bytes

? ? ? ? ? ? 4、boolean\byte;----1bytes

? ? ? ? ? ? 5、reference;----4bytes

例如:

class A{    byte a;}class B extends A{    long b;    short c;    byte d;}

?

?

属性占用字节数累计占用字节数head88a19?padding 312c214d115?padding 116b824

?第一次 padding 3是根据规则四

?第二次 padding 1是因为b属性是8个字节,因此需要按8个字节粒度对齐。B占用24bytes

?

?对于数组,与普通对象不同的是在头部,头部多了4个字节用于存储长度信息。因此数组的head是12bytes而不是8bytes

?

具体内容可以查看原文:http://www.codeinstructions.com/2008/12/java-objects-memory-structure.html

?

?

读书人网 >编程

热点推荐