java对象内存占用计算

对于常见的java类型,以下是将网络中的资料整理了

先说对于primitive类型,有8个

byte short int long float double char boolean 它们的长度分别是

1      2       4      8     4      8          2     1

再说Object的占用,在说这个之前,先说说引用,一惯的说法是

Java里没有指针了,只有引用,引用是安全的

这个说法没错,但是从机理上来说,引用就是指针,只是jvm对指针的使用检查和限制很多,这个引用/指针变得很安全

直接来结论:一个引用占4byte ,在32位系统上

Object obj=null; //4byte

Object[] objs=new Object[1000]; //至少4*1000byte

定义了一个 obj,还是null,就占4byte。虽然obj==null,但它已经是 一个引用,或者说一个指针了,指针也要占地方啊

接下来,直接给另一个结论: Object占8byte,注意,纯Object

Object obj=new Object(); //多少????

8byte?? 错!! 12byte,忘了还有一个引用,8byte是Object的内容

记住 Object obj=new Object(); 占12byte

Integer=Object+int  8+4=12 bytes 就是:

public class Integer {

public int value;

}

Integer应该占 8+4=12 bytes啊,你说的有道理,但是jvm对所有的Object有限制!!

这个限制被我发现了,就是不管什么Object占的空间,要是8的倍数

12不是8的倍数,只能是16了!!!

推论:Byte也占16bytes!!!!!!!!!!!

Long占16bytes!!!!!!!!!!!

对于普通的class来说,内容占用就是基加成员的占用,Object成员只记引用

public class Abc {

public int n;

public byte b;

public Object obj;

}

它的内容占用是: [8+4+1+4]=24

所以 Abc one=new Abc()的占用是 4+24=28

提醒:对于 Abc的成员 obj没有计,如果要计入的话,循环这个过程就可以了

单独说一下String,String的结构是:

public class String {

private final char value[];

private final int offset;

private final int count;

private int hash; // Default to 0

}


所以,不考虑那个char[]的占用,一个String最少占用 [8+4+4+4+4]=24bytes

加上引用,共28bytes

所以  String s="";  占用28bytes!!!!! 尽管它的长度为0


你可能感兴趣的:(java,object,null,double)