java - 找到浪费内存的类

标签 java android memory-management memory-leaks

我几个月前在 Google Play 上发布了一个应用程序,我的大多数用户都对我的应用程序的内存使用有严重的问题,这是真的,因为当我从“正在运行的应用程序”选项卡检查我的内存使用情况时,我看到它占用了 80~110MB 内存,如下图所示:

enter image description here

要查找导致此问题的类/Activity 或代码 fragment ,我发现 MAT(内存分析工具)插件很有用,但它确实让我感到困惑,请考虑下图:

enter image description here

已用内存的总大小为 9.8MB 但是“正在运行的应用程序”选项卡同时显示 80MB!

另一个问题是 Histogram,byte[] 对象的 Shallow Heap 太高了。

这正常吗?另外当我调试一些谷歌项目时,字节值总是太高!

enter image description here

那么我怎样才能找到正在使用所有这些内存的东西呢?

最佳答案

当 Android 应用程序启动时,它会继承由 Zygote 分配的对象 - 一种使应用程序生成速度更快的技巧。因此,当您获得内存转储时,它们会显示为您自己的。

为什么 Zygote 有那么多内存分配的答案是另一个使 resource 加载更快的技巧。在 Android 启动期间,Zygote 预加载 一些类和资源列表,因此所有其他应用程序不需要每次都加载它们。

参见 ZygoteInit.java #330 用于实现此预加载。

字节数组的大量使用是由于这种预加载的资源(位图)。

查看此 answer有关来自权威资源的 MAT/字节数组使用分析的更具体示例。

关于java - 找到浪费内存的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16214838/

相关文章:

java - 摆脱潜在的僵局

android - 地理标记照片的位置信息有多准确?

android - HLS Stream Android 4.4.2 三星 Galaxy S5 上没有视频

ios - 为什么这个 for 循环会耗尽内存?

C++测试矩阵是否已经初始化

java - 多维数组/数组的数组列表的问题

java - 一个浏览器中存在两个基于 servlet 引擎 cookie 的 session 的问题

java - 使用 JWT 安全 token 访问 REST API

Android 从 Java 访问 native 屏幕缓冲区

c - 从文件中读取并在动态结构上传输