Android 可能的内存泄漏

Android 可能的内存泄漏,android,memory-leaks,out-of-memory,Android,Memory Leaks,Out Of Memory,我运行了这个命令adb shell dumpsys meminfo,得到了 Objects Views: 74 ViewRootImpl: 1 AppContexts: 3 Activities: 1 Assets: 4 AssetManagers: 4 Local Bind

我运行了这个命令
adb shell dumpsys meminfo
,得到了

 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
请注意,活动AppContexts只需一次又一次地启动应用程序,它们就会不断增加。这是否意味着我有内存泄漏

我阅读了这份文件,其中说:

AppContext和Activities应用程序上下文和活动的数量 当前位于进程中的对象。这对我们来说很有用 快速识别不能成为垃圾的泄漏活动对象 由于它们上的静态引用而收集,这是常见的。这些 对象通常有许多与其相关联的其他分配,并且 因此,这是跟踪大型内存泄漏的好方法


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

之后,您可以使用MAT(内存分析器工具-)来识别导致泄漏的参考


祝你好运

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

  • 活动
  • 上下文
  • 位图/可绘制
  • 资源
在一些比活动本身寿命更长的容器中。这些容器可能是

  • 回调
  • 静态变量

观察如何使用内存分析器工具和堆转储查找内存泄漏的优秀分析

运行手动垃圾收集器会将此数量减少到1。所以我想这不是内存泄漏。