很抱歉,如果这可能是重复的,但我找不到适合我的问题的适当答案。因此,如果您可以引用良好的引用资料,我将不胜感激。
这是问题所在,我在运行应用程序时一直观察到细微的内存泄漏。因此,在运行16小时后,堆转储通过Eclipse Memory Analyzer运行,这表明内存泄漏可疑是很多线程没有被垃圾回收。运行大约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小时后。这对我来说没有任何意义,因为该引用是递归的,来回跳跃并且没有导致任何具体对象。
我应该如何调试此问题?
感谢任何帮助。
最佳答案
您可以尝试使用Leakcanary。它对于检测内存泄漏确实非常准确。它在Logcat中显示了泄漏跟踪,并且还向应用程序附加了其他 Activity ,从而保留了近期泄漏的历史记录。这应该有助于在不挖掘转储堆的情况下在代码中找到内存泄漏的可能位置。
关于java - 使用MATLAB的Android微妙内存泄漏分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38662817/