【参考链接】
java对象的内存布局http://blog.csdn.net/aitangyong/article/details/46416667
一个Java对象到底占用多大内存?http://www.cnblogs.com/magialmoon/p/3757767.html
前面在描述内存状态变化时,堆内存只是简单的以一个方块来代替
那实际上堆内存是怎样的呢?
本文使用64位的环境,并且是在未开启压缩的情况下。(默认会开启压缩,可以设置-XX:-UseCompressedOops来关闭)
对象
在堆上分配一块内存空间,将其引用保存在操作数栈中
这块堆上的内存空间包括,对象头、实例数据、填充空间。在64位系统上
对象头占16个字节
实例成员变量数据占
Primitive Type | Memory Required(bytes) |
boolean | 1 |
byte | 1 |
short | 2 |
char | 2 |
int | 4 |
float | 4 |
long | 8 |
double | 8 |
reference | 8(32位下占4个字节) |
对象头和实例数据不满8个字节要向8个字节填充。
为了观察对象实例占用的内存空间的大小,可以使用JOL (Java Object Layout)工具。(也可以使用MAT,但是他只会显示整个对象自身所占用的堆内存空间,不会详细查看每个实例成员变量数据占用的)
其官网及使用方式见http://openjdk.java.net/projects/code-tools/jol/
下载jar,我这里下载的是jol-cli-0.9-full.jar,并添加到工程的BuildPath中
新建一个Test.java类
Java Code
1 |
| package com.shadowfaxghh.test; |
新建一个Main.java类
Java Code
1 |
| package com.shadowfaxghh.test; |
输出如下
可以看到对象头占16个字节,int类型成员变量占4个字节,double类型成员变量占8个字节,填充4个字节,一共占32个字节。
继承时
数组
在堆上分配一块内存空间,将其引用保存在操作数栈中
这块堆上的内存空间跟上方的格式是相似的,只不过对象头占24个字节
以如下代码为例
Java Code
1 |
| package com.shadowfaxghh.test; |
输出如下
对于基本类型数组a,对象头占24个字节,3个数组项每个占4字节共12字节,填充4字节,共40字节
对于对象类型数组t,对象头占24个字节,3个数组项每个占8字节共24字节,共48字节。注意这里只是数组本身占用的内存空间,给数组项赋值以后,每个数组项还要分配各自的内存空间。