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

标签 java android memory-management ddms

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

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

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

enter image description here enter image description here

最佳答案

It is part of the system software

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

(以后有人问你‘这个“报告”到底是什么’的时候,随便举出实际命令)

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 将来自 native 代码(NDK 库)。

因此,首先找出您应用中的哪些内容使用了 native 代码。这可能是您的代码,也可能来自第三方库(例如 Fresco)。您的选择是:

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

  • 摆脱它们,或者

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

关于java - DDMS 报告不正确的内存使用情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34615127/

相关文章:

java - 通过语音命令启动应用程序 (android)

android - CMAKE 不遵守来自 gradle 的标志以在 Android 上构建 NDK

memory - Rust取消提交并将内存返回给操作系统的策略是什么?

c++ - 删除和内存管理

java - 如何检查数组的元素是否全部不同 Java

java - 在集成测试中覆盖 spring @Configuration

Android Studio 3.1 不显示 "Transitions"类别

ios - View Controller 的 NSMutableArray 不释放其对象的内存

java - 为什么我的 Java Appium 测试可以在本地运行,但在 Browserstack 上运行时却不稳定?

java - 应该使用尝试资源