当前位置: 首页 > 知识库问答 >
问题:

我们需要处理弱引用和上下文切换吗?

吴正祥
2023-03-14

为了减少内存泄漏,我们对运行在不同线程上的内部类中的活动保持弱引用。我们检查weakreference。get()为非null,然后只继续。如果我们检查weakreference呢。get()是非null的,但发生了垃圾收集,我们需要反复检查引用是否为非null,还是我遗漏了什么?

public class MainActivity extends Activity {    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        new MyAsyncTask(this).execute();
    }    
    private static class MyAsyncTask extends AsyncTask {
        private WeakReference<MainActivity> mainActivity;    
        
        public MyAsyncTask(MainActivity mainActivity) {   
            this.mainActivity = new WeakReference<>(mainActivity);            
        }       
        @Override
        protected Object doInBackground(Object[] params) {
            return doSomeStuff();
        }        
        @Override
        protected void onPostExecute(Object object) {
            super.onPostExecute(object);
            if (mainActivity.get() != null){
                //do something
                //context switching and garbage collection happen
                //again do a null check?
            }
        }
    }
}

共有2个答案

呼延衡
2023-03-14

每次访问变量时,都应该检查NOTNULL状态。但是还有一个额外的问题,你必须考虑在使用它之前的活动状态(我指的是生命周期状态)。

姜钊
2023-03-14

你应该做的是:

MainActivity temp = mainActivity.get();
if (temp != null){
    // Use 'temp' to access the `MainActivity`
}

假设temp不是null,那么现在在活动变量中对MainActivity对象有一个常规引用,这意味着该对象是强可访问的。垃圾收集器不会收集它。

(实际上,只要temp仍然可以到达,GC就不会破坏你的WeakReference。规范规定,如果ref的目标是强可到达的,GC不会破坏(可到达的)Reference中的ref。)

但另一方面,如果您没有对main活动的强引用,那么GC可能会在任何时候打破WeakReference。因此,您应该始终检查get()调用的结果。

 类似资料:
  • 问题内容: 我知道弱引用是垃圾收集器的摆布,我们不能保证弱引用会存在。我认为没有必要提供较弱的参考,但可以确定应该有一个理由。 为什么我们需要Java中的弱引用? Java中弱引用的实际(某些)用法是什么?如果您可以分享您在项目中的使用方式,那就太好了! 问题答案: 使用弱哈希图实际上通常是一个坏主意。首先,很容易出错,但更糟糕的是,它通常用于实现某种缓存。 这意味着以下内容:您的程序在一段时间内

  • 问题内容: 为什么在执行中断处理程序时无法进行上下文切换?更具体地说,在linux内核中,中断处理程序在被中断的进程的上下文中运行。为什么不能在中断处理程序中进行上下文切换来调度另一个进程? 问题答案: 在多处理器上,上下文切换当然可以在执行中断处理程序时发生。实际上,将很难预防。 根据定义,在单CPU机器上,它一次只能运行一个控制线程。它只有一个寄存器集,一个ALU,等等。因此,如果中断处理程序

  • 为了跨微服务跟踪服务调用,我们可以使用Zipkin。 从下面的网址,我们了解到通过微服务调用的时间可以在zipkin中捕获 https://tanzu.vmware.com/developer/guides/spring/spring-zipkin/ https://springhow.com/spring-boot-zipkin-distributed-tracing/ 我们还需要在使用zipk

  • 我使用的是SpringBatch 3.0。3并且需要一些关于不序列化作业执行上下文和步骤执行上下文的说明,因为我们有大型对象集,不希望将它们持久化到spring批处理表中。我们是否可以只存储短上下文而不是序列化对象?

  • 我试图在Reactor顶部设计一个管道框架。 在每个阶段(不考虑第一个和最后一个阶段),我们都有转换对象的任务(即字符串到其长度或url到其HTML内容等)。举个例子: 您可以看到中间层有3个任务,每个任务将一个X对象转换为一个Y对象(顺便说一句,它始终是一个完全连接的层) 我的问题/困境:我的第一个想法是,我所需要的是通量。merge(),然后将其连接到每个订阅者。例如: 另一种选择是放置处理器

  • 本文向大家介绍什么是上下文切换?相关面试题,主要包含被问及什么是上下文切换?时的应答技巧和注意事项,需要的朋友参考一下 多线程编程中一般线程的个数都大于 CPU 核心的个数,而一个 CPU 核心在任意时刻只能被一个线程使用,为了让这些线程都能得到有效执行,CPU 采取的策略是为每个线程分配时间片并轮转的形式。当一个线程的时间片用完的时候就会重新处于就绪状态让给其他线程使用,这个过程就属于一次上下文