私は配列を持っているとしましょう。配列の型はT
です。要素をnullに設定すると、ガベージコレクションにマークされます。Javaでの配列とガベージコレクション
たとえば、私がa[36] = null
を行う場合、またはさらにT
からnull
のオブジェクトにフィールドを設定する場合と同様に、さらに何かが必要なのでしょうか?
私は配列を持っているとしましょう。配列の型はT
です。要素をnullに設定すると、ガベージコレクションにマークされます。Javaでの配列とガベージコレクション
たとえば、私がa[36] = null
を行う場合、またはさらにT
からnull
のオブジェクトにフィールドを設定する場合と同様に、さらに何かが必要なのでしょうか?
他の人が言っていたように、コードなしではわかりにくいです。しかし、これは役立つかもしれない:
ジョシュブロッホの効果的なJavaの第2版章2項6によると、あなたがあなた自身のメモリを管理する場合、それはをGC'dできるようにするために、null
への参照を設定する必要があります。彼はあなたがnull
の参照をとすることができない場合、廃止された参照とこれらがOutOfMemoryError
を引き起こす可能性があることを説明します。
彼が与える例は次のとおりです(私はそれを短縮しています)。オブジェクトのプッシュとポップが可能なスタック実装を考えてみましょう。問題はpop
操作に現れる:あなたはsize
変数とGCを使用して手動で割り当てられたサイズを制御している
public class Stack {
private Object[] elements;
private int size = 0;
public Object pop() {
if (size == 0)
throw new EmptyStackException();
Object result = elements[--size];
elements[size] = null; // Eliminate obsolete reference, or you'll have a "memory leak"
return result;
}
注意が割り当てられ、自由であるされている要素を知ることはできません。
関連性がある場合は、彼の書籍のこのセクションを読んで詳細情報をお読みください。あなたのケースは私が書いたものと似ていますが、コードなしではわかりません。
Javaでは、オブジェクトはヒープに格納され、変数/参照はスタックに格納されます。 GCは、どの変数が実際のデータ型を参照していないかをチェックするとともに、オブジェクトがスコープ内でまだ参照されているかどうかをチェックする、いわゆるサイクルを実行します。マリオが言及しているように、オブジェクトは最終的に何も参照されていないときに収集されますが、一部のパフォーマンス/メモリの重要なアプリケーションでは、オブジェクトをヌルに設定し、ガベージコレクションプロセスを高速化しようとするとパフォーマンスが大幅に向上します。この場合、私はあまり心配しません。
これは簡単な例です。私の元のコードでは、SparkでScalaコードを使用しています.1つのタスクが終了して別のタスクが実行された後、エグゼキュータはメモリを使い果たしています。基本的には、前のタスクのメモリが適切にガベージコレクションされていないようです。そして、犯人は、HashMapに置かれたオブジェクト内のStringBuffer型の変数であるようです。最後にsetLengthメソッドを使用してStringBufferの長さを0に設定しても、それでも問題は解決しません。 – pythonic
さらにコードを投稿できますか?これらの種類のオブジェクトは、オブジェクト参照がまだ保持されていて収集されていない大量のデータを反復するループ内で発生する傾向があります。 –
ところで、あなた自身のメモリを管理していることを反映するために質問を編集し、質問の代わりにコメントに入れた余分な情報や 'OutOfMemoryError'を得ることができます。 – user1803551