对 WeakReference.get() 对象的硬引用会导致内存泄漏吗?

Could a hard-reference to WeakReference.get() object cause memory leak?

比方说,我们有一个很长的线程:

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() 获取的硬引用上下文是否会泄漏内存?

-是否应该在每次需要上下文时调用 contextRef,以避免泄漏?

-WeakReference.get()方法通过JNI调用native方法,调用get()方法会不会很贵?

Would hard referencing context gotten from WeakReference.get() leak memory?

如果某个对象仍在使用中,我不会认为这是内存泄漏。如果您保留不需要的内存,这可能是个问题。当您不再需要时,您可以 clear/discard 字符串引用。

对对象的弱引用不会改变任何强引用的行为。

Should contextRef be called each time context is needed, in order to avoid leaking?

仅当您同意它在执行此操作时消失。如果你需要这个 return 对象(甚至在你调用 运行() 之前)你需要持有一个字符串引用。

注意:你的例子,你第一次调用 get() 它可以 return null 但是如果这个 运行 根本不重要,你能不能完全不做。