假设:有对象 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个对象的内存。跪求大大往深了,往复杂了讲,可以说说最后内存的是分配使用和释放的。
谢谢!
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个对象的内存。跪求大大往深了,往复杂了讲,可以说说最后内存的是分配使用和释放的。
谢谢!
解决方案 »
- rt.jar ,dt.jar ,tool.jar是什么东西,什么时候需加到到classpath
- IBM JDK1.4.2 javacore分析原因
- applet如何传值给jsp^ 最好有例子 我会贡献我所以的积分的^
- 关于类内实例化对象
- 请各位指点
- 我觉得APPLET不能连接数据库的话就没有什么意思了,还能做什么?
- 基类与接口?(虽然才知道JAVA版something happened,但是有问题还是得冒险问啊)
- 如此applet,为何编译通不过
- 想我这样学习java要多长时间?
- 关于java的web服务器,请教高手...
- 请教一个thread问题。。。很奇怪。
- Java 运行时报的警告,高手给看看是什么意思
2.系统需要时才会回收不用的对象. 就是说回收对象并不一定会在每次循环后执行,jvm会根据内存使用情况而定.
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也未必会去进行垃圾收集。
}
}
一般是让jvm自动帮你处理会好一些,如果自己经常用System.gc()回收,反而会影响系统的性能. 有些时候,你需要java马上回收垃圾,从而让你达到某个目的,比如你上面的测试finalize(),这时可以调用system.gc().
第二,每次for循环后,a,b,c三个引用都会消亡,因此对应的三个对象的内存都会被释放,即被回收