DDMS 报告不正确的内存使用情况?

DDMS reporting incorrect memory usage?

我目前正在调查我们的一个 Android 应用程序是否存在内存泄漏,我发现了一些让我完全困惑的事情。

DDMS 堆监视器报告应用程序正在使用 13mb/20mb 堆内存,但直接从设备中提取的报告报告应用程序正在使用近 700mb!

这是设备的问题吗? DDMS错了吗?我如何找出这 700mb 中的内容?

It is part of the system software

第一个截图是adb shell dumpsys meminfo的输出。第二张截图看起来像是来自 procrank,它不是标准 Android 的一部分;至少,我无法在 Android 6.0.

上快速找到它

(以后有人问你的时候'what exactly is this "report"',随便引用实际命令)

Is this an issue with the device?

可能不是,虽然这很难说,因为我们不知道设备是什么,应用程序是什么,或者除了两张数码相机照片之外的任何东西。

Is DDMS wrong?

可能不会。 Java 代码,无论是 运行 在 Dalvik 还是 ART 中,都有一个堆限制,并且将远低于 700MB。

How do I find out what is going into that 700mb?

~600MB 最有可能来自本机代码(NDK 库)。

因此,首先找出您的应用中使用本机代码的内容。这可能是您的代码,也可能来自 third-party 库(例如 Fresco)。那么您的选择是:

  • 在这些库中调用(或实现)逻辑来限制它们使用的堆space,或者

  • 摆脱它们,或者

  • 看看是否有办法将 Valgrind 或其他东西连接到 NDK 代码以确定这些库在哪里以及如何使用这么多系统 RAM