假设:有对象 A B C 和方法 D
   D() {           A a = new A();
                     B b = new B();
                     C c = new C();    }有一段语句       for(int i=0 ;i<10;i++)
            {
                    D();
             }问题来鸟,当程序编译完成后,当调用D的时候,在内存中JAVA对象是不是一次性生成300个对象,还是调用一次生成3个,然后D结束后释放掉这3个对象的内存。跪求大大往深了,往复杂了讲,可以说说最后内存的是分配使用和释放的。
谢谢!

解决方案 »

  1.   

    我理解也不是很深,我的理解是,执行一次fpr循环,就会创建一匹对象。
      

  2.   

    1.每次循环创建三个并不是一次性创建.
    2.系统需要时才会回收不用的对象. 就是说回收对象并不一定会在每次循环后执行,jvm会根据内存使用情况而定.
      

  3.   

    这个问题楼主可以自己写代码验证一下。当对象被 回收前,会调用finalize()。可以自己写三个类,ClassA,ClassB,ClassC,然后重写finalize()方法,在finalize()方法加打印的语句,这样就可以验证了啊。
      

  4.   

    ClassA:public class ClassA {
    private int i = 0; public ClassA(int c) {
    i = c;
    } protected void finalize() throws Throwable { System.out.println("ClassA[" + i + "] be collected.");
    }
    }
    ClassB:public class ClassB {
    private int i = 0; public ClassB(int c) {
    i = c;
    } protected void finalize() throws Throwable { System.out.println("ClassB[" + i + "] be collected.");
    }
    }
    ClassC:public class ClassC {
    private int i = 0; public ClassC(int c) {
    i = c;
    } protected void finalize() throws Throwable { System.out.println("ClassC[" + i + "] be collected.");
    }
    }
    测试类:调用 D()
    这里为了看的清楚,给生成的对象一个标识,我给D方法中传入参数。
    public class ClassT {
    private void D(int count){
    ClassA a = new ClassA(count);
    ClassB b = new ClassB(count);
    ClassC c = new ClassC(count);
    }

    public static void main(String args[]){
    ClassT t = new ClassT();

    for(int i = 0; i < 10; i++){
    t.D(i);
    try {
    Thread.sleep(500);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }

    // System.gc(); //这里你注释掉,和不注释掉的情况下,各执行一下。
    //其实调用System.gc() 之后,JVM也未必会去进行垃圾收集。
    }
    }
      

  5.   

    对了,还有一种情况,你把 System.gc(); 加到 for 循环里,在t.D(i);后面紧接着调用,再打印下,应该清楚些。
      

  6.   

    感谢bzwm,以及楼上各位。已实验明白鸟,调试了半天,囧。那如果在web应用中类似这样调用一次函数生成的许多对象,是自己去控制对象的生成数量(工作量比较大),还是让GC去处理?公司的server被吃了很多内存,挂了好多次才想起来优化。囧死!
      

  7.   


    一般是让jvm自动帮你处理会好一些,如果自己经常用System.gc()回收,反而会影响系统的性能.  有些时候,你需要java马上回收垃圾,从而让你达到某个目的,比如你上面的测试finalize(),这时可以调用system.gc(). 
      

  8.   

    第一,每循环一次都会生成三个对象
    第二,每次for循环后,a,b,c三个引用都会消亡,因此对应的三个对象的内存都会被释放,即被回收