使用MAT

时间:2016-07-29 15:48:26

标签: java android multithreading memory-leaks

对不起,如果这可能是重复的,但我找不到任何适合我的问题的答案。因此,如果您可以参考一个好的来源,我将非常乐意看到。

问题是,在运行我的应用程序时,我一直在观察细微的内存泄漏。因此,运行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小时后。它对我没有任何意义,因为引用是递归的,来回跳跃而不是导致任何具体的对象。

MAT output

我该如何调试此问题?

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

您可以尝试使用Leakcanary。它对于检测内存泄漏非常准确。它显示了Logcat中的泄漏跟踪,并且它还为应用程序附加了其他活动,从而保留了最近泄漏的历史记录。它应该有助于在代码中找到可能的内存泄漏位置,而无需在转储堆中进行挖掘。