【问题标题】:Possible memory leak Android可能的内存泄漏 Android
【发布时间】:2014-11-13 14:02:39
【问题描述】:

我运行了这个命令adb shell dumpsys meminfo <package_name> 并得到了

 Objects
               Views:       74         ViewRootImpl:        1
         AppContexts:        3           Activities:        1
              Assets:        4        AssetManagers:        4
       Local Binders:       11        Proxy Binders:       20
    Death Recipients:        0
     OpenSSL Sockets:        2

 SQL
         MEMORY_USED:        0   
  PAGECACHE_OVERFLOW:        0          MALLOC_SIZE:        0

按下后退按钮并再次启动应用程序并重复此过程几次后:

 Objects
               Views:     1408         ViewRootImpl:        8
         AppContexts:       14           Activities:       12
              Assets:        5        AssetManagers:        5
       Local Binders:       13        Proxy Binders:       32
    Death Recipients:        0
     OpenSSL Sockets:        1

 SQL
         MEMORY_USED:        0
  PAGECACHE_OVERFLOW:        0          MALLOC_SIZE:        0

注意 ActivityAppContexts 计数,它们只是通过一次又一次地启动应用程序而不断增加。这是否意味着我有内存泄漏?

我读了这份文件https://developer.android.com/tools/debugging/debugging-memory.html#ViewingAllocations,上面写着:

AppContexts and Activities 应用上下文和Activity的数量 当前存在于您的进程中的对象。这对 快速识别泄露的不能是垃圾的Activity对象 由于它们上的静态引用而收集,这很常见。这些 对象通常有很多与它们相关的其他分配,并且 这是跟踪大量内存泄漏的好方法。

【问题讨论】:

    标签: android memory-leaks out-of-memory


    【解决方案1】:

    Android 中内存泄漏的最常见原因是保留实例

    • 活动
    • 上下文
    • 位图/可绘制
    • 资源

    在一些比 Activity 本身寿命更长的容器中。这些容器可能是

    • 回调
    • 静态变量

    观看https://www.youtube.com/watch?v=_CruQY55HOk 了解如何使用内存分析器工具和堆转储查找内存泄漏的出色分析。

    【讨论】:

      【解决方案2】:

      这似乎是内存泄漏。为了确保它是,您可以在每次迭代测试后强制运行垃圾收集器(您可以使用 DDMS 来完成)。这样做,您将确定这是内存泄漏。

      之后,您可以使用 MAT (Memory Analyzer Tool - http://www.eclipse.org/mat/) 来识别导致泄漏的引用。

      祝你好运!

      【讨论】:

      • 运行手动垃圾收集器会将这个数字减少到 1。所以我猜这不是内存泄漏。
      猜你喜欢
      • 1970-01-01
      • 2011-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-23
      • 1970-01-01
      相关资源
      最近更新 更多