很抱歉这些简单的问题,但我是Java新手 (通常用c写)
在循环中执行new删除对象的旧实例吗?
我需要像
这样的东西 for(;;)
{
// work on here pixels[]
source = new MemoryImageSource(200, 200, pixels, 0, 50);
image = createImage(source;
// then use image here
}
我只需要在上面找到source
和image
对象的新内容
在每一帧,并不想打扰删除它,
但是我也不想将大量的内容泄漏为内存泄漏
它会被自动删除吗?这是重型操作吗?
答案 0 :(得分:5)
是的,不再被引用的对象将被自动垃圾收集(将来在未指定的位置)。
我建议将source
和image
的声明移到循环中:
for(;;) {
...
Source source = new MemoryImageSource(200, 200, pixels, 0, 50);
Image image = createImage(source);
...
}
这不仅在风格上是优选的,它还避免了将最后一次迭代的对象保持的时间超过了必要的时间。
答案 1 :(得分:2)
不,在循环中为变量创建和分配新实例不会“删除”它所指向的旧实例。但是,只要没有对该实例的其他引用,它就有资格被垃圾收集。
答案 2 :(得分:1)
GC是JAVA和C ++之间的基本区别。 Java开发人员不再需要关心删除实例,并且一旦实例不再被引用,GC机制将自动删除它。
例如,
for (int i =0;i < 2;i ++){
source = new MemoryImageSource(200, 200, pixels, 0, 50);
}
实际上,在循环中,创建了2个实例。但是在循环之后只有第二个实例被源引用。所以第一个实例有资格被垃圾收集。
答案 3 :(得分:1)
循环内部的Java行为可能相当奇怪。请参阅Marko Topolnik对Java OutOfMemoryError strange behaviour
的解释答案 4 :(得分:1)
我认为效率最高的是:
Image image;
for(;;) {
image = createImage(new MemoryImageSource(200, 200, pixels, 0, 50));
...
}
如果您使用了很多不需要的引用,则会删除一个不需要的引用,并且重复使用Image图像引用而不是在每次迭代中分配内存以供参考。