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

на вопросы, говорит все сам:

-Would трудно ссылки контекст получил от метода WeakReference.get() происходит утечка памяти?

-Высокий контекстRef вызывается каждый раз, когда необходим контекст, чтобы избежать утечки?

-Метод WeakReference.get() вызывает собственный метод через JNI, метод get() будет стоить дорого?

ответ

1

Сложный справочный контекст, полученный из WeakReference.get() утечки памяти?

Если объект все еще используется, я бы не стал считать это утечкой памяти. Если вы сохраняете память, вам это не нужно, это может быть проблемой. Вы можете очистить/отменить ссылку на строку, когда она вам больше не нужна.

Имея слабую ссылку на объект, не меняет поведение любой сильной ссылки.

Должен ли быть вызван контекстRef каждый раз, когда необходим контекст, чтобы избежать утечки?

Только если вы в порядке с этим исчезаете, пока вы это делаете. Если вам нужно это, чтобы вернуть объект (даже до вызова run()) вам нужно сохранить ссылку на строку.

Примечание: ваш пример при первом вызове get() он может возвращать null, но если это не имеет значения, вообще ли это работает, можете ли вы просто не делать этого вообще.

+0

Этот вопрос немного сфокусирован на Android. GC в Android может восстановить память с помощью GC-ing объекта Context, поэтому, если контекстный объект трудно ссылаться, это не будет возможным. Таким образом, объект может быть использован, но также может быть проблемой. Итак, мой вопрос заключается в том, что если жесткий референтный результат WeakReference.get() не позволит GC очистить объект – BamsBamx

+0

@BamsBamx, то сильная ссылка всегда предотвращает сбор объекта, независимо от того, что вы делаете. –

+0

, так что в этом случае: жесткая привязка результата WeakReference.get() совпадает с результирующим «утешительным» объектом, переданным в конструкторе MyRunnable? – BamsBamx