在循环中新建删除旧对象?

时间:2012-11-28 07:22:10

标签: java oop garbage-collection

很抱歉这些简单的问题,但我是Java新手 (通常用c写)

在循环中执行new删除对象的旧实例吗?

我需要像

这样的东西
   for(;;)
   {

     // work on here pixels[] 

     source = new MemoryImageSource(200, 200, pixels, 0, 50);
     image  = createImage(source;

    // then use image here

   }

我只需要在上面找到sourceimage对象的新内容 在每一帧,并不想打扰删除它, 但是我也不想将大量的内容泄漏为内存泄漏 它会被自动删除吗?这是重型操作吗?

5 个答案:

答案 0 :(得分:5)

是的,不再被引用的对象将被自动垃圾收集(将来在未指定的位置)。

我建议将sourceimage的声明移到循环中:

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图像引用而不是在每次迭代中分配内存以供参考。

相关问题