Java中的WeakReference和垃圾收集
只是一个简单的问题,在执行方法时是否可以进行垃圾收集?因为我相信一段代码胜过千言万语,所以我们开始:Java中的WeakReference和垃圾收集,java,memory-leaks,Java,Memory Leaks,只是一个简单的问题,在执行方法时是否可以进行垃圾收集?因为我相信一段代码胜过千言万语,所以我们开始: public void start() { // view is an instance of WeakReference<View> and is not null if (view.get() != null) { fetchFeaturedProducts(view.get().getCategory()); // Some
public void start() {
// view is an instance of WeakReference<View> and is not null
if (view.get() != null) {
fetchFeaturedProducts(view.get().getCategory());
// Some work
// More work
// And more work
//
// Garbage collections happens, now view.get() is null
//
// Is it possible?
// If yes, then I think there is now way to get around it other then checking right before dereferencing?
// Or am I wrong and being paranoid?
// Or is there a sophisticated way to resolve this issue other than using Kotlin?
fetchProducts(view.get().getCategory(), Manufacturer.All_COMPANIES, Tarteeb.TARTEEB_NONE, true);
}
}
public void start(){
//视图是WeakReference的实例,不为null
if(view.get()!=null){
fetchFeaturedProducts(view.get().getCategory());
//一些工作
//更多工作
//还有更多的工作
//
//垃圾收集发生,现在view.get()为空
//
//可能吗?
//如果是的话,那么我认为现在有办法绕过它,然后在解引用之前检查一下?
//还是我错了,偏执狂?
//或者除了使用Kotlin之外,还有什么复杂的方法来解决这个问题?
fetchProducts(view.get().getCategory(),Manufacturer.All_companys,Tarteeb.Tarteeb_NONE,true);
}
}
真的需要你的专家建议。谢谢:)
编辑:
如果这是可能的,我正在考虑创建一个扩展WeakReference
的伪类,并重写get
方法来检查null
。如果它是null
,则返回一个不做任何操作的视图的伪对象。。
但我有一种感觉,这更多的是一个黑客而不是一个解决方案。有更好的想法吗?这绝对可以而且必须发生——如果没有执行任何方法,JVM将终止。当然,详细信息取决于实际的JVM供应商、操作系统和硬件,但集合可以在分配过程中触发,也可以同时触发。它可以停止方法或让它们部分继续。您无法控制这一点(并且很少需要关心)
除此之外,引用处理可能独立于所有这些处理,因此在所有情况下,引用都可能变为null
处理引用变为null(实际上对于普通getter也很有效)的方法是首先将其赋值给一个局部变量,然后检查该变量是否为null。它永远不会在您的眼睛下改变,并且会在您的作用域的生命周期内保持引用对象的活动状态(如果您不使用变量,则会有一些限制)。不,先生,它不会重复。。我不是在问软引用或弱引用的定义。我正在寻求一种Java解决方案,以避免如此多的空检查。请查看@SotiriosI,我已经删除了那个。刷新相应的副本。GC可以在调用get()
并清除引用之前的任何时间发生。正如副本所示,您需要存储get()
的结果,并将其与null
进行比较。您不能直接比较wr.get()!=null,然后再次调用get()
,因为两者之间的窗口可能涉及清除引用的GC。是的,我知道了。。谢谢,因为您仍在使用视图将view.get()存储在局部变量中,并且在保存引用时不会收集该视图。