对 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
但是如果这个 运行 根本不重要,你能不能完全不做。
比方说,我们有一个很长的线程:
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
但是如果这个 运行 根本不重要,你能不能完全不做。