标题说的有点晦涩,举个例子吧。假设有两个类,A和B。
两个类拥有一样的成员变量,假设都是10个。
A没有成员方法,但是B有10个方法。
那么A和B各new出100个对象出来,所消耗的内存是一样多吗?类里面的方法,是仅仅占用类本身的代码区内存,还是同样会存在于对象内存之中?
两个类拥有一样的成员变量,假设都是10个。
A没有成员方法,但是B有10个方法。
那么A和B各new出100个对象出来,所消耗的内存是一样多吗?类里面的方法,是仅仅占用类本身的代码区内存,还是同样会存在于对象内存之中?
分别new A和Bpublic class Test {
private static final Runtime s_runtime = Runtime.getRuntime(); private static long usedMemory() {
return s_runtime.totalMemory() - s_runtime.freeMemory();
} private static void runGC() throws Exception {
long usedMem1 = usedMemory(), usedMem2 = Long.MAX_VALUE;
for (int i = 0; (usedMem1 < usedMem2) && (i < 500); ++i) {
s_runtime.runFinalization();
s_runtime.gc();
Thread.currentThread().yield();
usedMem2 = usedMem1;
usedMem1 = usedMemory();
}
} public static void main(String[] args) throws Exception {
System.out.println(Test.usedMemory());
for (int i = 0; i < 1000; i++) {
A a = new A();
}
System.out.println(Test.usedMemory());
Test.runGC();
System.out.println(Test.usedMemory());
}
}class A {
private String a;
private String b;
private String c;
private String d;
private String e;
private String f;
private String g;
private String h;
private String i;
private String j;
}class B {
private String a;
private String b;
private String c;
private String d;
private String e;
private String f;
private String g;
private String h;
private String i;
private String j; public String getA() {
return a;
} public void setA(String a) {
this.a = a;
} public String getB() {
return b;
} public void setB(String b) {
this.b = b;
} public String getC() {
return c;
} public void setC(String c) {
this.c = c;
} public String getD() {
return d;
} public void setD(String d) {
this.d = d;
} public String getE() {
return e;
} public void setE(String e) {
this.e = e;
} public String getF() {
return f;
} public void setF(String f) {
this.f = f;
} public String getG() {
return g;
} public void setG(String g) {
this.g = g;
} public String getH() {
return h;
} public void setH(String h) {
this.h = h;
} public String getI() {
return i;
} public void setI(String i) {
this.i = i;
} public String getJ() {
return j;
} public void setJ(String j) {
this.j = j;
}
}
网上也有很多这样的问题。计算例如:
Runtime runtime = Runtime.getRuntime();
long before = runtime.freeMemory();
long totalbefore = runtime.totalMemory();
byte[] buf = new byte[1024*1024*5];
long after = runtime.freeMemory();
long totalafter = runtime.totalMemory();
System.out.println("buf use " + ((totalafter - after)-(totalbefore - before)) + " bytes memory");
每个对象8个字节,field的大小参考sun规范。每个对象的总大小必须是8的倍数。所以一个Integer的大小是8+4=12个字节,但由于是8的倍数,因此实际是16个字节。
一个字符串"aaa"的大小是8+4(hascode)+4(char数组的引用)+char数组对象大小
char数组对象大小是8+4+2*3=24
因此一共是40个字节。当然如果String中还有其他Field则还要加上还有GC在运作,很难得到真实的答案啊lz
函数地址占用四字节,自然会多占用内存空间,
如果静态的则不占用另外,还有个字节对齐问题,跟楼上的是8的倍数类似吧不知道java是不是有参考性
感觉B占的内存大些,因为Java编译成字节码,依靠JVM去解释和执行,它的代码不应该在代码区里。若说的不对,大家尽管扔板砖,hoho
1)类里面的方法,仅仅占用类本身的代码区内存,不会存在于对象内存之中
2)那么A和B各new出100个对象出来,所消耗的内存是一样多吗?
与JVM实现相关。以SUN的JVM来说,一个对象的内存布局是:第一部分:是一个指针,指向该对象所拥有的方法的列表。 第二部分:一个指针,指向一个代表该对象类型的一个Class对象,第三部分:该对象的数据成员空间。
因此,我认为:B会多些。以上仅供你参考