1

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

new in 循环删除对象的旧实例?

我需要类似的东西

   for(;;)
   {

     // work on here pixels[] 

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

    // then use image here

   }

我只需要到上面,每帧新包装sourceimage对象,不想麻烦删除它,而且我不想存储大量它们作为内存泄漏,
它会被自动删除吗?是不是繁重的操作?

4

5 回答 5

5

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

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

for(;;) {
  ...
  Source source = new MemoryImageSource(200, 200, pixels, 0, 50);
  Image image  = createImage(source);
  ...
}

这不仅在风格上更可取,而且还避免了将最后一次迭代的对象保留的时间超过必要的时间。

于 2012-11-28T07:30:49.963 回答
2

不,在循环中创建新实例并将其分配给变量并不会“删除”它所指向的旧实例。但是,只要没有对实例的其他引用,它就有资格被垃圾收集。

于 2012-11-28T07:28:41.957 回答
1

GC 是 JAVA 和 C++ 的基本区别。Java 开发者不再需要关心删除实例,一旦实例不再被引用,GC 机制会自动删除它。例如, for (int i =0;i < 2;i ++){ source = new MemoryImageSource(200, 200, pixels, 0, 50); } 在循环中,实际上创建了 2 个实例。但是在循环之后只有第二个实例被源引用。所以第一个实例有资格被垃圾收集。

于 2012-11-28T07:39:50.610 回答
1

循环内的 Java 行为可能相当奇怪。请参阅 Marko Topolnik 对Java OutOfMemoryError 奇怪行为的解释

于 2012-11-28T07:59:37.143 回答
1

我想说最有效的是:

Image image;

for(;;) {

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

如果您使用大量引用,则会删除一个不必要的引用,然后重用 Image 图像引用,而不是在每次迭代中为引用分配内存。

于 2012-11-28T08:22:51.583 回答