Android:使用 MAT 查找内存泄漏

Posted

技术标签:

【中文标题】Android:使用 MAT 查找内存泄漏【英文标题】:Android: Finding Memory Leaks with MAT 【发布时间】:2012-07-31 01:12:38 【问题描述】:

我的应用存在重大问题。当我运行它并选择某个活动时,屏幕变黑并且基本上冻结了。我在 logcat 中得到了一长串 GC 消息。我下载了 MAT 并让它分析堆以查找内存泄漏。我的问题是我是新手,我不知道它告诉我泄漏在哪里。

以下是它给我的三个。谁能向我解释如何解决这些问题?我一直在疯狂搜索,似乎找不到任何帮助。

问题一:

The class "android.database.sqlite.SQLiteDatabase$ActiveDatabases", loaded by "<system class loader>", occupies 652,048 (20.70%) bytes. The memory is accumulated in one instance of "java.util.HashMap$HashMapEntry[]" loaded by "<system class loader>".

问题 2:

6,831 instances of "java.lang.String", loaded by "<system class loader>" occupy 456,472 (14.49%) bytes. 

问题 3:

127 instances of "org.bouncycastle.jce.provider.X509CertificateObject", loaded by "<system class loader>" occupy 451,280 (14.32%) bytes. These instances are referenced from one instance of "java.util.Hashtable$HashtableEntry[]", loaded by "<system class loader>"

【问题讨论】:

Here's a Google IO talk on using MAT 其实我已经看过了,不过谢谢你的建议。 【参考方案1】:

首先你应该检查 SQLiteDatabase 游标是否在不使用时关闭,特别是遇到异常后。 我认为你应该长期观察你“相信”的这些问题。因为 MAT 只是推测这些。你必须有证据表明某些对象占用了很大的内存导致你的应用程序被系统杀死。否则,你应该“搜索”android 著名的内存泄漏问题用google找个线索。

祝你好运!

【讨论】:

这确实有帮助。我认为我没有正确关闭游标。为了解决这个问题,我在我的 DB Helper 类中创建了一个单独的方法来关闭游标(如果它是打开的),并在调用关闭数据库之前调用它。谢谢!

以上是关于Android:使用 MAT 查找内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

Android内存泄漏检测与MAT使用

Memory Analyzer (MAT)Android内存泄漏分析,快速定位

Android内存泄漏查找和解决

android 中如何分析内存泄漏

android Leakcanary/Studio Profiler/MAT 处理内存问题(泄漏和Big超大内存对象)

android Leakcanary/Studio Profiler/MAT 处理内存问题(泄漏和Big超大内存对象)