我几个月前在 Google Play 上发布了一个应用程序,我的大多数用户都对我的应用程序的内存使用有严重的问题,这是真的,因为当我从“正在运行的应用程序”选项卡检查我的内存使用情况时,我看到它占用了 80~110MB 内存,如下图所示:
要查找导致此问题的类/Activity 或代码 fragment ,我发现 MAT(内存分析工具)插件很有用,但它确实让我感到困惑,请考虑下图:
已用内存的总大小为 9.8MB 但是“正在运行的应用程序”选项卡同时显示 80MB!
另一个问题是 Histogram,byte[]
对象的 Shallow Heap 太高了。
这正常吗?另外当我调试一些谷歌项目时,字节值总是太高!
那么我怎样才能找到正在使用所有这些内存的东西呢?
最佳答案
当 Android 应用程序启动时,它会继承由 Zygote
分配的对象 - 一种使应用程序生成速度更快的技巧。因此,当您获得内存转储时,它们会显示为您自己的。
为什么 Zygote 有那么多内存分配的答案是另一个使 resource
加载更快的技巧。在 Android 启动期间,Zygote 预加载 一些类和资源列表,因此所有其他应用程序不需要每次都加载它们。
参见 ZygoteInit.java #330 用于实现此预加载。
字节数组的大量使用是由于这种预加载的资源(位图)。
查看此 answer有关来自权威资源的 MAT/字节数组使用分析的更具体示例。
关于java - 找到浪费内存的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16214838/