我在以下代码中遇到了内存泄漏:
@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()调用:
告诉当前正在执行的线程进入睡眠状态(不使用任何CPU)。
释放锁,以便其他线程可以唤醒并获取该锁。
似乎wait()也导致保存局部变量。我以前没有意识到这一点。这些局部变量在哪里?它仍在“ VM堆栈”中吗?是否有关于此的更多教程?
=================更新=====================
SmartConfigMainActivity与NetworkDetector没有任何关系。我认为该消息已在Looper中重新使用,这导致了此内存泄漏。但是我无法控制android的这种重用行为。 如我所见,jvm应该保存局部变量以防止它出现在gc中,因为当wait()返回时,它应该回到原始状态并使用这些变量。但是我没有看到有关此的任何教程