8

こんにちは私はの3つの配列変数を持っていると考えてa[dynamic], b[dynamic], c[dynamic]ください。それらは任意のサイズにすることができます。変数を破棄したいのですが。私はもう変数を使用しないと確信しています。どんなアイデアや提案も歓迎します。

4

3 に答える 3

20

配列をガベージコレクターに割り当てることで、配列を解放できることをガベージコレクターに示すことができますnull

    int[] a = new int[someSize];
    int[] b = new int[someSize];
    ....
    // I no longer need 'a'
    a = null;
    // ... but I can still use 'b'

ただし、注意すべき点がいくつかあります。

  • これはスペースを解放しません。むしろ、それはアレイをガベージコレクターによって解放される資格を与えています。GCは、長時間解放できない場合があります。

  • 実際、配列は、到達できない場合にのみガベージコレクションの対象となります。配列への参照を別の(まだライブの)変数または到達可能なオブジェクトに割り当てた場合、GCはそれを再利用しません。

  • 実際のJavaアプリケーションでこれを行うことに意味があることはめったにありません。通常の計算過程では、変数がスコープ外になることを単純に許可するのが通常の方法です1null変数が長期間スコープから外れることがなく、大きな配列/オブジェクトまたはネットワークを参照している場合は、そのような変数(またはオブジェクトフィールドまたは配列要素)のみを明示的に指定します。

  • ...またはever2System.gc()を割り当てた後に呼び出して、GCを強制的に実行しようとすることは強くお勧めしません。通話に影響がある場合は、高額になる可能性があります。JVMに最適な時間にGCをスケジュールさせることをお勧めします。null


1-妥当なJVM実装は、メソッドが終了するとローカル変数がスコープ外になることを認識します。JVMがスコープをより細かく追跡するかどうかは実装固有であり、(正直に言うと)JVMが実際にこれをどのように処理するかはわかりません。

GCが到達可能な(つまり、ガベージ以外の)オブジェクトを削除しない限り、ほぼすべてがJLS要件に技術的に準拠していることに注意してください。これには、Epsilon no-op GCを使用するJVMが含まれます。これは、ガベージを収集せず、スペースが不足するとJVMを終了します。

2-唯一の正当な理由は次のとおりです。1)GC関連機能の動作をテストする。例:ファイナライザー、参照キュープロセッサーなど、または2)リアルタイムアプリケーションでの有害なGC一時停止の回避。たとえば、リアルタイムゲームで「レベル」を変更するときにGCを実行します。

于 2012-05-10T15:08:25.677 に答える
2

Stephen Cがあなたの質問に答えましたが、非プリミティブ型の場合、配列内のすべてのオブジェクトが不要な場合はnullとしてマークされていることを確認します。これにより、メモリリークが発生しなくなります。

何かのようなもの:

for(Object obj : myObjectArray){
  obj = null;
}

次に、配列参照をnullにします

myObjectArray = null;
于 2012-05-10T15:20:58.937 に答える
0

arrayListからすべての要素を削除するには

arrayList.removeAll(arrayList);

于 2017-09-15T13:11:43.237 に答える