0

Wir haben, sagen wir mal, einen sehr langen Faden:Könnte ein Hard-Verweis auf WeakReference.get() Objekt Speicherverlust verursachen?

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(); 
} 

Die Fragen sagt alles selbst:

-Would hart Referenzierung Kontext von WeakReference.get() ein Speicherleck bekommen?

-Sollte contextRef jeden Kontext aufgerufen werden benötigt, um undichten zu vermeiden?

-Der WeakReference.get() -Methode eine native Methode durch JNI nennt, wäre get() Methodenaufruf teuer?

Antwort

1

Wäre hart Referenzierungskontext von WeakReference.get() Leckspeicher abgerufen?

Wenn ein Objekt noch verwendet wird, würde ich dies nicht als ein Speicherleck betrachten. Wenn Sie Speicher behalten, den Sie nicht benötigen, kann dies ein Problem sein. Sie können den String-Verweis löschen/verwerfen, wenn Sie ihn nicht mehr benötigen.

eine schwache Referenz auf ein Objekt zu haben nicht das Verhalten eines starken Bezug ändern.

Soll contextRef jedes Mal aufgerufen werden, wenn Kontext benötigt wird, um ein Lecken zu vermeiden?

Nur wenn Sie damit einverstanden sind, verschwinden während Sie dies tun. Wenn Sie dies benötigen, um das Objekt zurückzugeben (noch bevor Sie run() aufrufen), müssen Sie eine String-Referenz halten.

Hinweis: Ihr Beispiel, das erste Mal, dass Sie get() anrufen kann es null zurückgeben, aber wenn es egal ist, ob dies überhaupt läuft, könnten Sie es überhaupt nicht tun.

+0

Diese Frage ist ein bisschen auf Android konzentriert. Der GC in Android könnte Speicher wiederherstellen, indem er das Context-Objekt per GC einloggt. Wenn das Kontextobjekt hart referenziert wird, ist dies nicht möglich. Auf diese Weise könnte das Objekt noch benutzt werden, könnte aber auch ein Problem darstellen. So ist meine Frage, ob das Fest Referenzierung WeakReference.get() Ergebnis würde die GC vermeiden, das Objekt zu löschen – BamsBamx

+0

@BamsBamx eine starke Referenz immer verhindert ein Objekt, egal gesammelt werden, was Sie sonst noch tun. –

+0

Also, in diesem Fall: Hard-Referenzierung der WeakReference.get() -Ergebnis ist das gleiche wie Hard-Referenzierung 'Leakable' Objekt im MyRunnable-Konstruktor übergeben? – BamsBamx

Verwandte Themen