1

このような簡単な質問で申し訳ありませんが、私はJavaを初めて使用します(通常はcで記述します)

new in loopは、オブジェクトの古いインスタンスを削除しますか?

私はのようなものが必要です

   for(;;)
   {

     // work on here pixels[] 

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

    // then use image here

   }

source上記のように、すべてのフレームにオブジェクトの新しいラッピングを取得する必要があり、imageそれを削除する必要はありませんが、メモリリークとして大量に保存したくないのですが、
自動的に削除されますか?重い操作ですか?

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

最も効率的なのは次のとおりです。

Image image;

for(;;) {

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

不要な参照を 1 つ削除すると、それらを大量に使用した場合に蓄積されます。また、参照の反復ごとにメモリを割り当てる代わりに、Image イメージ参照を再利用します。

于 2012-11-28T08:22:51.583 に答える
1

GC は、JAVA と C++ の基本的な違いです。Java 開発者はインスタンスの削除を気にする必要がなくなり、インスタンスが参照されなくなると、GC メカニズムによって自動的に削除されます。たとえば、 for (int i =0;i < 2;i ++){ source = new MemoryImageSource(200, 200, pixels, 0, 50); } ループでは、実際には 2 つのインスタンスが作成されます。ただし、ループ後にソースによって参照されるのは 2 番目のインスタンスのみです。したがって、最初のインスタンスはガベージ コレクションの対象となります。

于 2012-11-28T07:39:50.610 に答える
1

ループ内での Java の動作はかなり奇妙かもしれません。Java OutOfMemoryError の奇妙な動作に関する Marko Topolnik の説明を参照してください。

于 2012-11-28T07:59:37.143 に答える