java对象内存_java对象占内存大小

本文详细探讨了Java中对象和数组的内存占用情况,包括对象头、成员变量、数组长度、对齐填充等因素。通过公式计算,举例说明了不同类型对象和数组的内存估算方法,强调了大规模二维数组可能带来的内存消耗问题,并提示开发者尽量避免长期持有大型二维数组对象以优化内存使用。
摘要由CSDN通过智能技术生成

通常情况下Hotspot虚拟机里Heap(堆)中的Java对象占用的内存包括:

Object Header占用的内存,普通对象的Object Header占用8个字节的内存,数组对象的Object Header占用12个字节的内存(其中的4个字节用于存储数组的长度)

成员变量占用的内存

基本数据类型的成员变量(primitive field),boolean/byte类型耗用1个字节,char/short类型耗用2个字节,int/float类型耗用4个字节,long/double类型耗用8个字节

对象类型的成员变量(reference field),每个变量一个4个字节的reference

Padding(对齐)需要的额外内存,padding部分是紧跟在object data后面的若干(0~7)个字节,使得整个对象耗用的字节数能被8整除。

于是对象占用的内存大小可以用下面的公式进行估算:

sizeof(obj) = ceil((sizeof(object header) + sum(sizeof(primitive field)) + 4*num(reference field))/8)*8

例如,对于下面一个Class:

class MyClass { // 8 bytes (object header)

byte a; // 1 byte

int c; // 4 bytes

boolean d; // 1 byte

long e; // 8 bytes

Object f; // 4 bytes (reference)

}

不考虑padding(对齐)的情况下该类的实例大约占用26(8 + 1 + 4 + 1 + 8 + 4)个字节,进行padding后将占用32个字节的空间。

注意:这里估算的内存占用大小并不包括对象类型的成员变量所占用的内存大小,这里只计算reference占用的内存大小。

一维数组的内存占用量:

在Java里数组也是对象,且数组对象的Object Header比普通对象的要多4个字节,这4个字节是用来存储数组长度用的。另外数组对象也会被Padding(补齐)。

基本数据类型的数组对象占用的内存大小可以用下面的公式进行估算:

sizeof(array) = ceil((12 + sizeof(primitive field)*m)/8)*8 #m为数组的长度

如长度为10的int类型的数组int[10]占用的内存大小为: ceil((12 + 4*10)/8)*8 = 56

对象数组Object[]占用的内存大小可以用下面的公式进行估算:

sizeof(Object[]) = ceil((12 + 4*m)/8)*8

4*m中的4表示每个Object reference占用的内存大小,4个字节;m表示数组的长度。

再例如,对于String类:

public final class String { // 8 bytes (object header)

private final char value[]; // 4 bytes (reference)

private final int offset; // 4 bytes

private final int count; // 4 bytes

private int hash; // 4 bytes

}

一个包含n个字符的String对象整体(包括char[]数组)占用的内存大小为:

sizeof(string) = ceil((8 + 4 + 4 + 4 + 4)/8)*8 + ceil((12 + 2*n)/8)*8

二维数组的内存占用量:

Java中的二维(多维)数组与C语言中的二维(多维)数组有非常大的不同。Java中的二维(多维)数组是由nested数组构成的一个级联结构,二维(多维)数组中的每一行都是一个reference指向的nested数组。

于是对于一个m*n的二维数组array[m][n],它的内存占用量包括下面两部分:

1个长度为m的外层数组占用的内存,可以表示为:ceil((12 + 4*m)/8)*8

m个长度为n的内存数组占用的内存,可以表示为:m*(ceil((12 + sizeof(nested_array_type)*n)/8)*8)

对于基本数据类型的二维数组,sizeof(nested_array_type)为对应基本数据类型的内存使用量

对于Object[][],sizeof(nested_array_type)等于4个字节,即reference的内存使用量

例如,对于int类型的二维数组int[m][n],它的内存占用量估算为:

ceil((12 + 4*m)/8)*8 + m*(ceil((12 + 4*n)/8)*8)

假设(m=1000000, n=3),则该二维数组的内存占用量为:

ceil((12 + 4*1000000)/8)*8 + 1000000*(ceil((12 + 4*3)/8)*8) = 28,000,016

结论:尽量避免长期持有(引用)大规模的二维数组对象

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值