对象内存模型[0]

参考链接

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

8324个字节)

对象头和实例数据不满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
2
3
4
5
6
 

 

package com.shadowfaxghh.test;

public class Test {
    int m1=100;
    double m2=200;
}

 

新建一个Main.java

 Java Code 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 

 

package com.shadowfaxghh.test;

import org.openjdk.jol.info.ClassLayout;
import org.openjdk.jol.vm.VM;

public class Main {

    public static void main(String[] args) {

        //显示虚拟机信息
         System.out.println(VM.current().details());  
         
         System.out.println(ClassLayout.parseClass(Test.class).toPrintable());//通过类来查看堆内存
         
        Test t=new Test();
         System.out.println(ClassLayout.parseInstance(t).toPrintable());//通过实例来查看堆内存
    }

}

 

输出如下

可以看到对象头占16个字节int类型成员变量占4个字节,double类型成员变量占8个字节,填充4个字节,一共占32个字节

 

继承时

 

数组

在堆上分配一块内存空间,将其引用保存在操作数栈中

这块堆上的内存空间跟上方的格式是相似的,只不过对象头占24个字节

以如下代码为例

 Java Code 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 

 

package com.shadowfaxghh.test;

import org.openjdk.jol.info.ClassLayout;
import org.openjdk.jol.vm.VM;

public class Main {

    public static void main(String[] args) {

        // 显示虚拟机信息
        System.out.println(VM.current().details());

        int[] a=new int[3];
        System.out.println(ClassLayout.parseInstance(a).toPrintable());// 通过实例来查看堆内存
        
        Test[] t = null;
        t=new Test[3];
        System.out.println(ClassLayout.parseInstance(t).toPrintable());

    }
}

 

输出如下

对于基本类型数组a,对象头占24个字节,3个数组项每个占4字节共12字节,填充4字节,共40字节

对于对象类型数组t对象头占24个字节,3个数组项每个占8字节共24字节,共48字节。注意这里只是数组本身占用的内存空间,给数组项赋值以后,每个数组项还要分配各自的内存空间。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值