6

私はJavaガベージコレクターについて調査しましたが、参照されなくなったオブジェクトはガベージコレクターによって処理される/処理される必要があることを理解しています。オブジェクトの配列に関しては、新しいオブジェクトを配列内の場所に割り当てると、以前に割り当てられたオブジェクトの割り当てが適切に解除されないことを認識しています。

  1. 場所xの配列からオブジェクトを削除して適切に割り当てを解除し、場所xの同じ配列に新しいオブジェクトを割り当てる方法を知りたいです。
  2. また、アレイ自体の割り当てを適切に解除する方法も知りたいです。
4

4 に答える 4

9

配列内のnullオブジェクトを別のオブジェクトまたは別のオブジェクトに設定すると、同じオブジェクトへの参照がどこにも格納されていないことを前提として、ガベージコレクションの対象になります。

だからあなたが持っているなら

Object[] array = new Object[5];
Object object = new Object() // 1 reference
array[3] = object; // 2 references
array[1] = object; // 3 references


object = null; // 2 references
array[1] = null; // 1 references
array[3] = new Object(); // 0 references -> eligible for garbage collection

array = null; // now even the array is eligible for garbage collection
// all the objects stored are eligible too at this point if they're not
// referenced anywhere else

ただし、ガベージコレクションがローカルのメモリを再利用することはめったにないため、ガベージコレクションは、ほとんどの場合、関数の範囲外ですでに発生します。

于 2013-02-09T16:54:03.660 に答える
1

Javaでは、オブジェクトが配列からの参照であるか、単純なフィールドまたは変数であるかに関係なく、オブジェクトの割り当てを明示的に解除する必要はありません。オブジェクトがルートセットから強く到達可能でなくなると、ガベージコレクションは遅かれ早かれオブジェクトの割り当てを解除します。そして、GCがその仕事をするのを手伝おうとするのは通常不合理です。詳細については、この記事をお読みください。

于 2013-02-09T16:55:17.543 に答える
0

すべてのオブジェクトは、参照されなくなったときにガベージコレクターによって自動的に収集されます。あなたはそれについて悩む必要はありません。それでも、必要に応じて配列にnullを割り当てることができ、GCの次の実行時に、配列に割り当てられたメモリが自動的に割り当て解除されます。GCを明示的に実行するために、次のことができます。

    java.lang.Runtime.getRuntime().gc();
于 2013-02-09T16:53:44.443 に答える
0

オブジェクトの割り当て解除は、オブジェクトを無効にして閉じるまたは開くときに発生する必要があります。JUnitテストは、オブジェクトに対してassertGCを実行して、すべてのオブジェクトがガベージコレクションされていることを確認します。参照がある場合、Javaはアイテムをガベージコレクションしません。JUnitテストを行うことを強くお勧めします。

于 2013-05-29T19:58:22.767 に答える