我正在研究一个 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 或本机堆上看不到任何问题。