【问题标题】:Android Subtle Memory leak analysis using MAT使用 MAT 的 Android Subtle 内存泄漏分析
【发布时间】:2016-12-04 09:46:15
【问题描述】:

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

这就是问题所在,我在运行我的应用程序时一直在观察细微的内存泄漏。所以运行 16 小时后,堆转储通过 Eclipse 内存分析器运行,这表明内存泄漏怀疑是很多线程没有被垃圾收集。运行大约 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 小时后。这对我来说没有任何意义,因为引用是递归的,来回跳转并且不会导致任何具体对象。

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

感谢任何帮助。

【问题讨论】:

    标签: java android multithreading memory-leaks


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2014-05-03
      • 1970-01-01
      • 2012-10-29
      • 2013-05-24
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 2012-05-09
      • 1970-01-01
      相关资源
      最近更新 更多