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()存储在局部变量中,并且在保存引用时不会收集该视图。