0

我々は、のは言う非常に長いスレッドましょう、持っている:質問WeakReference.get()オブジェクトのハードリファレンスによってメモリリークが発生する可能性がありますか?

private static class MyRunnable implements Runnable { 

    private final WeakReference<Context> contextRef; 

    private MyRunnable(Context leakable) { 
     contextRef = new WeakReference<>(leakable); 
    } 

    @Override public void run() { 
     Context context = contextRef.get(); 
     if (context == null) return; 
     //VERY LONG TASK 
     //Would hard referencing context gotten from WeakReference.get() leak memory? 
     //Should contextRef be called each time context is needed? 
    } 
} 


private void startThread() { 
    new MyThread(this, new MyRunnable(this)).start(); 
} 

はすべて自分自身の言葉:WeakReference.get(から得

-Wouldハード参照コンテキスト)メモリリークが発生?

- 漏れを防ぐために、コンテキストが必要なたびにcontextRefを呼び出す必要がありますか?

-WeakReference.get()メソッドは、JNIを介してネイティブメソッドを呼び出し、get()メソッドコールが高価になりますか?

答えて

1

WeakReference.get()リークメモリからのハード参照コンテキストはありますか?

オブジェクトがまだ使用されている場合、これはメモリリークとは考えられません。必要のないメモリを保持している場合、これが問題になる可能性があります。不要になったときに文字列参照をクリア/破棄することができます。

弱い参照をオブジェクトに持たせても、強い参照の動作は変わりません。

コンテキストリークが発生しないように、コンテキストが必要なたびにcontextRefを呼び出す必要がありますか?

あなたがこれを行う際に消えてしまった場合のみ。オブジェクトを返すためにこれを必要とする場合(run()を呼び出す前でも)、文字列参照を保持する必要があります。

注:最初にget()に電話すると、nullを返すことができますが、これが全く実行されるかどうかは関係ありません。

+0

この質問はAndroidに少し焦点が当てられています。 AndroidのGCは、ContextオブジェクトをGCingすることでメモリを再利用することができます。このようにして、オブジェクトはまだ使用できますが、問題になる可能性もあります。だから、私の質問は、WeakReference.get()の結果を参照するとGCがオブジェクトをクリアするのを避けることができる場合です。 – BamsBamx

+0

@BamsBamx強い参照は、他に何があってもオブジェクトが収集されるのを常に防ぎます。 –

+0

です。この場合、WeakReference.get()の結果をハードリファレンスすることは、MyRunnableコンストラクタで渡された 'リーク可能な'オブジェクトをハード参照することと同じですか? – BamsBamx

関連する問題