标题说的有点晦涩,举个例子吧。假设有两个类,A和B。
两个类拥有一样的成员变量,假设都是10个。
A没有成员方法,但是B有10个方法。
那么A和B各new出100个对象出来,所消耗的内存是一样多吗?类里面的方法,是仅仅占用类本身的代码区内存,还是同样会存在于对象内存之中?

解决方案 »

  1.   

    带方法的会多占一点.
    分别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;
    }
    }
      

  2.   

    lz可以计算下来啊
    网上也有很多这样的问题。计算例如:
    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");   
      

  3.   

    不同虚拟机的对象大小不同。以sun的jvm为例   
    每个对象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
      

  4.   

    如果按照c/c++
    函数地址占用四字节,自然会多占用内存空间,
    如果静态的则不占用另外,还有个字节对齐问题,跟楼上的是8的倍数类似吧不知道java是不是有参考性
      

  5.   

    根JVM相关,还有字节对齐和GC,所以计算的结果不一定准确,只是个参考。
    感觉B占的内存大些,因为Java编译成字节码,依靠JVM去解释和执行,它的代码不应该在代码区里。若说的不对,大家尽管扔板砖,hoho
      

  6.   

    答:
    1)类里面的方法,仅仅占用类本身的代码区内存,不会存在于对象内存之中
    2)那么A和B各new出100个对象出来,所消耗的内存是一样多吗?
      与JVM实现相关。以SUN的JVM来说,一个对象的内存布局是:第一部分:是一个指针,指向该对象所拥有的方法的列表。 第二部分:一个指针,指向一个代表该对象类型的一个Class对象,第三部分:该对象的数据成员空间。
    因此,我认为:B会多些。以上仅供你参考
      

  7.   

    这就要看jvm的设计问题了,云上飞翔说的没错,参数列表,对象类型,数据部分