【问题标题】:Find the class that waste the Memory找到浪费内存的班级
【发布时间】:2013-04-19 08:28:02
【问题描述】:

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

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

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

另一个问题是直方图,byte[]对象的浅堆太高了。

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

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

【问题讨论】:

  • 你签出this question了吗?这听起来像你想要的。
  • 这里要明确一点,你试过常规调试吗?您希望使用该空间,搜索字节 [] 等的代码。

标签: java android memory-management memory-leaks


【解决方案1】:

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

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

有关此预加载的实现,请参阅ZygoteInit.java#330。

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

请参阅此answer,了解来自权威资源的 MAT/字节数组使用分析的更具体示例。

【讨论】:

    【解决方案2】:

    您是否尝试过使用visual vm?这是一个很好的教程,可以找出类和实例的内存使用情况 (visual vm tutorial)。希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2012-01-17
      • 2013-05-26
      • 1970-01-01
      • 1970-01-01
      • 2016-05-16
      • 2012-06-23
      相关资源
      最近更新 更多