Java 属性的内存结构记录
转载于知乎 刘缙 的回答
struct Point {
float x;
float y;
float z;
};
bytes | field |
---|---|
4 | x |
4 | y |
4 | z |
bytes | field |
---|---|
12 | object header |
4 | x |
4 | y |
4 | z |
struct Line {
struct Point begin;
struct Point end;
};
bytes | field |
---|---|
4 | begin.x |
4 | begin.y |
4 | begin.z |
4 | end.x |
4 | end.y |
4 | end.z |
struct Point v[100];
bytes | field |
---|---|
4 | v[0].x |
4 | v[0].y |
4 | v[0].z |
4 | v[1].x |
4 | v[1].y |
4 | v[1].z |
… | … |
int e;
int f = 3;
String a;
String b = new String();
String c = "xxx";
可以看到只有b、c、f 属性分配了内存空间。以此可以确认声明变量时(无论引用类型还是基本类型),都不在内存分配空间,只有声明的变量触发了初始化后(initialized),才会被分配内存空间,例如变量作为类静态(static)属性,类加载后就会初始化,或者作为方法的形参也会被初始化。
注意"引用"也是占用空间的,基本类型的引用就是“数据”本身,引用类型的引用是“数据”所在内存空间的首地址
这里要特殊考虑String,以及Integer、Double等几个基本类型包装类,它们都是immutable类型,因为没有提供自身修改的函数,每次操作都是新生成一个对象,并把该空间的首地址赋给引用。