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

时间:2017-02-10 10:12:55

标签: java multithreading performance memory-leaks weak-references

我们有一个非常长的话题:

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()泄漏内存中获取硬盘引用上下文?

-Should contextRef每次需要上下文时调用,以避免泄漏?

-WeakReference.get()方法通过JNI调用本机方法,会对get()方法调用贵吗?

1 个答案:

答案 0 :(得分:1)

  

硬引用上下文是否会从WeakReference.get()泄漏内存中获取?

如果仍在使用某个对象,我不认为这是内存泄漏。如果你保留了你不需要的内存,这可能是个问题。您可以在不再需要时清除/丢弃字符串引用。

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

  

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

只有当你这样做时,它才会消失。如果你需要这个来返回对象(甚至在你调用run()之前),你需要保存一个字符串引用。

注意:您的示例是,第一次调用get()时,它可以返回null,但如果根本不运行则无关紧要,您是否可以根本不执行此操作。