提问者:小点点

使用MAT进行Android微妙内存泄漏分析


如果这可能是一个潜在的重复,我很抱歉,但是我找不到任何合适的答案来解决我的问题。所以如果你能参考一个好的来源,我将非常乐意去看看。

这就是问题所在,我在运行应用程序时一直观察到细微的内存泄漏。因此,运行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屏幕抓取-左面板是在运行应用程序5分钟后,右面板是在16小时后。对我来说没有任何意义,因为引用是递归的,来回跳跃,不指向任何具体对象。

我应该如何调试这个问题?

感谢任何帮助。


共1个答案

匿名用户

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