当线程wait()时,局部变量仍然会导致内存泄漏

时间:2018-09-13 03:18:09

标签: java android multithreading memory-leaks

我在以下代码中遇到了内存泄漏:

    @Override
    public void run() {
        while (true) {

            if(!isRunning) {
                break;
            }
            ThreadHandler handler = threadHandlerRef.get();
            if(handler == null) {
                break;
            }

            handler.sendMessage(Message.obtain(handler, 1, this));

            synchronized (this) {
                try {
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }

    }

内存泄漏如下:

In com.****.****:4.2.10:6796.
* com.****.****.SmartConfigMainActivity has leaked:
* GC ROOT com.****.****..NetworkDetector$DThread.<Java Local>
* references android.os.Message.obj
* references com.****.****.$3.a
* references com.****.****.mCommonBindView
* references com.****.****.CommonBindView.mContext
* leaks com.****.****. instance

作为gc根的线程,用于保存诸如Message之类的本地变量。因此,来自link的wait()调用:

  1. 告诉当前正在执行的线程进入睡眠状态(不使用任何CPU)。

  2. 释放锁,以便其他线程可以唤醒并获取该锁。

似乎wait()也导致保存局部变量。我以前没有意识到这一点。这些局部变量在哪里?它仍在“ VM堆栈”中吗?是否有关于此的更多教程?

=================更新=====================

SmartConfigMainActivity与NetworkDetector没有任何关系。我认为该消息已在Looper中重新使用,这导致了此内存泄漏。但是我无法控制android的这种重用行为。 如我所见,jvm应该保存局部变量以防止它出现在gc中,因为当wait()返回时,它应该回到原始状态并使用这些变量。但是我没有看到有关此的任何教程

0 个答案:

没有答案