我正在调查我们的一个Android内存泄漏应用程序,我发现了一些让我感到困惑的事情。
DDMS堆监视器报告应用程序正在使用13mb / 20mb堆内存,但直接从设备提取的报告报告该应用程序使用了近700mb!
这是设备的问题吗? DDMS错了吗?我如何找出700mb的内容?
答案 0 :(得分:1)
它是系统软件的一部分
第一个屏幕截图是isWinner
的输出。第二个屏幕截图看起来像来自adb shell dumpsys meminfo
,它不是标准Android的一部分;至少,我无法在Android 6.0上快速找到它。
(将来,当有人问你这"报告"'时,请随意引用实际命令)
这是设备的问题吗?
可能不是,虽然这很难说,因为我们不知道设备是什么,应用程序是什么,或者是两张数码相机照片之外的其他东西。
DDMS是否错误?
可能不是。 Java代码,无论是在Dalvik还是ART中运行,都有一个堆限制,而且这个代码将远低于700MB。
如何找出700mb的内容?
〜600MB将来自本机代码(NDK库),最有可能。
首先,找出您的应用中使用本机代码的内容。这可能是您的代码,也可能来自第三方库(例如Fresco)。您的选择是:
调用(或实现)这些库中的逻辑以限制它们使用的堆空间,或者
摆脱它们,或
看看是否有办法将Valgrind或其他东西连接到NDK代码,以确定这些库在何处以及如何使用如此多的系统RAM