Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 循环中的新对象是否删除旧对象?_Java_Oop_Garbage Collection - Fatal编程技术网

Java 循环中的新对象是否删除旧对象?

Java 循环中的新对象是否删除旧对象?,java,oop,garbage-collection,Java,Oop,Garbage Collection,很抱歉问这么简单的问题,但我是Java新手 (通常用c写) 新循环中是否删除对象的旧实例 我需要像这样的东西 for(;;) { // work on here pixels[] source = new MemoryImageSource(200, 200, pixels, 0, 50); image = createImage(source; // then use image here } 我只需要在上面看到,sourc

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

新循环中是否删除对象的旧实例

我需要像这样的东西

   for(;;)
   {

     // work on here pixels[] 

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

    // then use image here

   }
我只需要在上面看到,
source
image
对象的新包装 在每一帧中,并且不想费心删除它, 但我也不想将大量内存存储为内存泄漏,

它会被自动删除吗?这是一项繁重的操作吗?

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

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

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

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

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

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

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

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

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

<>这不仅是风格上的最佳,而且避免了最后一次迭代对象的持续时间比java的长。

GC是Java和C++之间的基本区别。Java开发人员不再需要关心删除实例,一旦实例不再被引用,GC机制将自动删除它。 例如

for(int i=0;i<2;i++){
source=新的MemoryImageSource(200200像素,0,50);
}

在循环中,实际上创建了两个实例。但只有第二个实例被循环后的源引用。因此,第一个实例有资格被垃圾收集

> P> GC是java与C++之间的基本区别。Java开发人员不再需要关心删除实例,一旦实例不再被引用,GC机制将自动删除它。 例如
for(int i=0;i<2;i++){
source=新的MemoryImageSource(200200像素,0,50);
}

在循环中,实际上创建了两个实例。但只有第二个实例被循环后的源引用。因此,第一个实例有资格被垃圾收集

循环内的Java行为可能相当古怪。请参阅Marko Topolnik对循环内Java行为的解释,该解释可能相当古怪。参见Marko Topolnik对

的解释,我认为最有效的方法是:

Image image;

for(;;) {

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

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

我认为最有效的方法是:

Image image;

for(;;) {

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


如果你使用了大量的图像引用,你会删除其中一个不必要的引用,并且你会重复使用图像引用,而不是在每次迭代中为引用分配内存。

你无论如何都不能删除Java中的内容。你可以把它们排成队列进行垃圾收集。好的,但它能正常工作吗?每个不再被引用的对象都会被GC清除,尽管它并不总是一次完成。(@perception-对于我的观点,我不想在上面这么说)请随意回滚编辑,这就是协作wiki的意义所在!无论如何,您不能在Java中删除内容。你可以把它们排成队列进行垃圾收集。好的,但它能正常工作吗?每个不再被引用的对象都会被GC清除,尽管它并不总是一次完成。(@perception-对于我的观点,我不想在上面这么说)请随意回滚编辑,这就是协作wiki的意义所在!它会制造麻烦吗?或者可以使用它吗?如果没有,我还能用什么方法来做呢?只要你在代码的其他地方(例如,在你的
createImage
函数中)保留
源代码
实例,你应该会没事的。它会制造麻烦吗?或者可以使用它吗?如果没有,我还能用什么方法呢?你应该没事,只要你在代码的其他地方(例如,在你的
createImage
函数中)保留
源代码
实例就行了。在循环中声明和初始化对象是不好的风格,这样会消耗更多的资源……最好在方法中声明它们,当方法超出范围时,对象会被清除up@firephil:问题的关键在于每次迭代都有一对新对象。我的观点是,如果循环运行1000次,您可以重用一个引用,而不是1000个引用时代。你的方式每次循环时,你都要计算新引用源、图像和新对象源、图像,但你不必为每次迭代计算新引用,只需计算新对象。在循环中声明和初始化对象是不好的方式,这样会消耗更多的资源……最好在方法中声明它们,当方法超出范围时,对象会被清除up@firephil:问题的关键在于每次迭代都有一对新对象。我的观点是,如果循环运行1000次,您可以重用一个引用,而不是1000个引用时代。您的方式每次循环时,您都要计算新引用源、图像和新对象源、图像,但您不必为每次迭代计算新引用,只需计算新对象即可。