Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对WeakReference.get()对象的硬引用是否会导致内存泄漏?_Java_Multithreading_Performance_Memory Leaks_Weak References - Fatal编程技术网

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

Java 对WeakReference.get()对象的硬引用是否会导致内存泄漏?,java,multithreading,performance,memory-leaks,weak-references,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); } @Overrid

比如说,我们有一条很长的线:

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();
}
私有静态类MyRunnable实现Runnable{
私有最终WeakReference contextRef;
私有MyRunnable(上下文可泄漏){
contextRef=新的WeakReference(可泄漏);
}
@重写公共无效运行(){
Context=contextRef.get();
if(context==null)返回;
//很长的任务
//从WeakReference.get()获取的硬引用上下文是否会泄漏内存?
//是否应在每次需要上下文时调用contextRef?
}
}
私有void startThread(){
新的MyThread(this,新的MyRunnable(this)).start();
}
这些问题本身就说明:

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

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

-get()方法通过JNI调用本机方法,get()方法调用会很昂贵吗

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

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

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

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

只有当你做这件事的时候它消失了,你才可以。如果需要使用此函数返回对象(甚至在调用run()之前),则需要保留字符串引用


注意:在您的示例中,第一次调用
get()
时,它可以返回
null
,但如果它是否运行并不重要,您可以干脆不执行它。

这个问题有点集中在安卓上。Android中的GC可以通过GC调用上下文对象来回收内存,因此,如果上下文对象是硬引用的,这是不可能的。这样,该对象仍然可以使用,但也可能成为一个问题。所以,我的问题是,硬引用WeakReference.get()结果是否可以避免GC清除object@BamsBamx强引用始终阻止收集对象,无论您执行其他操作。因此,在这种情况下:硬引用WeakReference.get()结果与在MyRunnable构造函数中传递的硬引用“leakable”对象相同?@BamsBamx在此处使用WeakReference而不是强引用的唯一区别是,它可能在调用run()之前消失,但在调用它时不会消失。注意:除非GC运行,否则这无关紧要。@BamsBamx:您似乎有一种错误的心态,反复说“硬引用WeakReference.get()”。你对一个对象有很强的引用,仅此而已。无论您是通过调用
WeakReference.get()
还是通过任何其他方式检索该对象,都与此无关。强引用就是强引用。