2

我正在研究一个 lwp,随着时间的推移,通过 UI(设置、应用程序、运行)报告的内存使用量显示出内存使用量不断增加(从 ~18M 开始,在我使用它之前已经攀升至 90M)。这似乎很糟糕,让我找到了一定是内存泄漏的问题。所以我使用了 ddms,它表明虽然应用程序显示内存使用量增加,但 Dalvik 分配的堆为 ~13.7M,并且随着时间的推移变化不会超过 ~500K。好的,所以它必须在本机堆上。我包含了 Debug.getNativeHeapSize() 和 Debug.getNativeHeapAllocatedSize() 的日志,它们都报告了 ~5M 本机堆 +/- ~2M,与 UI 显示内存使用量增加一致。除了 Dalvik 和 native 还有什么其他的内存使用?所以我在这里读到了 Diane Hackborn 的优秀文章并意识到我还有很多东西要学。我使用了 adb shell dumpsys meminfo,结果如下:

** MEMINFO in pid 6856 **
                         Shared  Private     Heap     Heap     Heap
                   Pss    Dirty    Dirty     Size    Alloc     Free
                ------   ------   ------   ------   ------   ------
       Native     1118     1116     1076     5072     3452       59
       Dalvik     4102    16204     3584    15111    14077     1034
       Cursor        0        0        0                           
       Ashmem        2        4        0                           
    Other dev    33344      292      820

“Other Dev”加上 Native/Pss 和 Dalvik/Pss 的巨大 33M“Pss”大致是 UI 报告的内存使用情况。阅读 Diane 的帖子,我不知道我是否应该担心我的内存使用情况。我可以看到“Pss/Other dev”值随着时间的推移而攀升,但我的原生堆和 Dalvik 堆仍然保留在 ddms 和 Debug.getNativeHeapSize() 报告它们所在的位置。我很困惑,不知道我是否应该担心,除了用户会看到我的 lwp 正在消耗这么多的“内存”,而据我所知,它实际上并没有泄漏。

有谁明白这里发生了什么?这在 Galaxy Nexus,ICS 4.0.2 上。

编辑:我随后试图通过让 Other/Pss 爬升直到应用程序在 UI 中达到约 2 亿的报告使用量来使应用程序崩溃。它确实崩溃了:

E/IMGSRV  ( 8337): :0: __map: Map device memory failed
W/GraphicBufferMapper( 8337): registerBuffer(0x3364c0) failed -14 (Bad address)
F/libc    ( 8337): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1)
I/DEBUG   (  114): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***

所以我有一些东西要修复,我不知道从哪里开始,因为我在 dalvik 或本机堆上看不到任何问题。

4

0 回答 0