参考链接

java对象的内存布局http://blog.csdn.net/aitangyong/article/details/46416667

一个Java对象到底占用多大内存?http://www.cnblogs.com/magialmoon/p/3757767.html

 

 

前面在描述内存状态变化时,堆内存只是简单的以一个方块来代替

那实际上堆内存是怎样的呢?

 

本文使用64位的环境,并且是在未开启压缩的情况下。(默认会开启压缩,可以设置-XX:-UseCompressedOops来关闭

对象内存模型[0]

 

 

对象

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

这块堆上的内存空间包括,对象头、实例数据、填充空间。在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());//通过实例来查看堆内存
    }

}

 

输出如下

对象内存模型[0]

可以看到对象头占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());

    }
}

 

输出如下

对象内存模型[0]

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

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

 

 

 

相关文章:

  • 2021-06-16
  • 2022-12-23
  • 2022-12-23
  • 2021-06-05
  • 2021-04-17
  • 2021-04-07
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-12-08
  • 2021-06-28
  • 2022-01-17
  • 2021-10-10
  • 2021-05-30
相关资源
相似解决方案