对不起,如果这可能是重复的,但我找不到任何适合我的问题的答案。因此,如果您可以参考一个好的来源,我将非常乐意看到。
问题是,在运行我的应用程序时,我一直在观察细微的内存泄漏。因此,运行16个小时后,堆转储通过Eclipse Memory Analyzer运行,它表明内存泄漏可疑是很多Thread没有被垃圾回收。运行大约16个小时后,堆增加了3MB。
以下是我用来运行后台任务的代码:
private WorkerThread mWorkerThread;
private static Runnable mUploadTask = new Runnable() {
@Override
public void run() {
Object[] data = dataQueue.poll();
if( data != null ) {
uploadPacketviaAMQP((String)data[0], (String)data[1]);
}
};
private static class WorkerThread extends HandlerThread{
private Handler mWorkerHandler;
public WorkerThread(String name) {
super(name);
}
public void postTask(Runnable task){
mWorkerHandler.post(task);
}
public void prepareHandler(){
mWorkerHandler = new Handler(getLooper());
}
}
所以这里是MAT屏幕抓取 - LEFT面板是在运行应用程序5分钟后,RIGHT面板是在16小时后。它对我没有任何意义,因为引用是递归的,来回跳跃而不是导致任何具体的对象。
我该如何调试此问题?
感谢任何帮助。
答案 0 :(得分:0)
您可以尝试使用Leakcanary。它对于检测内存泄漏非常准确。它显示了Logcat中的泄漏跟踪,并且它还为应用程序附加了其他活动,从而保留了最近泄漏的历史记录。它应该有助于在代码中找到可能的内存泄漏位置,而无需在转储堆中进行挖掘。