`
329937021
  • 浏览: 122554 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java对象占内存大小

阅读更多
空对象占8个字节
有数据成员的话,你把数据成员按基本数据类型和对象引用分开统计。
基本数据类型按byte/boolean=1,char/short=2,int/float=4,long/double=8,累加,然后对齐到8的倍数。
对象引用按每个4字节,累加,然后对齐到8个字节的倍数。
=============
对象占用字节数=基本的8字节+基本数据类型所占的+对象引用所占的

比如
class A{
int a;
char b;
}
占 8(基本)+8(int 4+char 2=6,对齐到8)= 16个字节
再比如:
class B{
Integer a;
long b;
byte c;
}
占 8(基本)+8(long8+byte1=9,对齐到8)+8(对象引用4,对齐到8)=32个字节

===============
如果你是从别的类继承的,父类的也要算上。

这与C++不同,C++中,空对象占一个字节,有数据成员则按数据成员对齐后,得到的大小

#include <iostream.h>
class A
{
private:
int i;
    char b;
};

void main()
{
A a;
cout<<sizeof(a)<<endl;
}

得到的是8
分享到:
评论
3 楼 iliveido 2011-09-09  
liuxinglanyue 写道
“占 8(基本)+8(long8+byte1=9,对齐到8)+8(对象引用4,对齐到8)=32个字节 ”
这句有问题吧,jvm分配内存是按照 8byte 的倍数来分配的,
class B{
Integer a;
long b;
byte c;
}
大小为:空对象大小(8byte)+long大小(8byte)+byte大小(1byte)+空Integer引用的大小(4byte)=21byte
由于要是 8byte 的倍数,所以是 24byte
可以参照这个程序,把Te类改动一下,结果运行如下:

'before' heap: 143560, 'after' heap: 143584
heap delta: 24
size = 24 bytes


按照这篇文章的阐述http://www.codeinstructions.com/2008/12/java-objects-memory-structure.html,博主确实是错的。因为引用变量的首地址也是要按4字节对齐的,所以,应该是8+8+1+3(对齐)+4 =24。补充一点,由于24刚好被8整除,所以不用再填充字节。
2 楼 liuxinglanyue 2010-12-30  
“占 8(基本)+8(long8+byte1=9,对齐到8)+8(对象引用4,对齐到8)=32个字节 ”
这句有问题吧,jvm分配内存是按照 8byte 的倍数来分配的,
class B{
Integer a;
long b;
byte c;
}
大小为:空对象大小(8byte)+long大小(8byte)+byte大小(1byte)+空Integer引用的大小(4byte)=21byte
由于要是 8byte 的倍数,所以是 24byte
可以参照这个程序,把Te类改动一下,结果运行如下:

'before' heap: 143560, 'after' heap: 143584
heap delta: 24
size = 24 bytes
1 楼 hoszb 2010-09-05  
sun的32位虚拟机,空对象是8字节
sun的64为虚拟机,空对象是16字节
jrockit的32位和64为虚拟机,空对象都是8字节

相关推荐

Global site tag (gtag.js) - Google Analytics