【问题标题】:Lots of RAM use by very large byte arrays?非常大的字节数组使用大量 RAM?
【发布时间】:2015-05-22 00:22:07
【问题描述】:

长期以来,我一直在尝试修复我的应用程序中的内存泄漏,但我一直陷入死胡同。该应用程序以图像为中心,因此我使用 Picasso 库来处理缓存和内存使用。我将高内存使用(我的应用程序高达 100-170mb)传递给 Picasso 的糟糕内存管理,但我做了一些测试并禁用了 Picasso 的内存缓存,它加载了我所有的图像,并且没有非常明显的下降在 RAM 使用中。它仍在使用 90 到 170 mb 以上的 RAM。我做了一个完整的堆转储到一个 hprof 文件中,并用 MemoryAnalyzer 打开它来查看: http://i.gyazo.com/6b8d884852fa7cae546fc4cad1fc44c9.png.

如果我转到 GC 根路径,它显示没有根,也没有父级。在这 25 个海量字节数组中,超过 50,000,000 字节的任何一个都没有链接,我真的不知道从哪里开始寻找它的原因。 您对错误可能是什么以及任何可能的修复有任何建议吗?

非常感谢您帮助我!

【问题讨论】:

  • Java 是一种垃圾收集语言。在其他应用程序施加内存压力之前,您可能无法恢复该内存,然后该内存将被其他应用程序使用,而不是释放。换句话说,它可能不是内存泄漏。
  • 虽然它可能不是泄漏,但我的应用程序仍在使用 100-170 mb 的 RAM,它会导致许多 OOM
  • 使用LeakCanary查看是否有泄漏。
  • @Emmanuel 已安装并使用 LeakCanary,但没有找到任何东西。我已经遇到了 2 次 OOMS,但没有任何报告,所以我认为我的问题与内存泄漏无关,而是内存滥用。我的问题仍然存在!
  • @ccrama : 你是怎么解决你的问题的.. 我也面临同样的问题.. 我用过 LeakCanary .. 没有找到!你能建议stackoverflow.com/questions/39503505/…

标签: android arrays memory byte ram


【解决方案1】:

尝试使用LeakCanary查找内存泄漏。

另外,您可以尝试Fresco 进行图像加载和显示,它将图像存储在本机内存区域中,因此您不会使用托管区域中的太多内存,GC 不会花费太多时间并且您可以避免OutOfMemoryErrors。

【讨论】:

  • 没听说过 Fresco,现在试试!我还发现了 LeakCanary 的一些错误(不相关),非常感谢!
  • 不幸的是,从 Picasso 切换时,Fresco 将我的内存占用了大约 30 MB。这让我相信位图不是问题,库或我的代码还有其他一些潜在的问题。主要的内存杀手是只有 -1 的 900 万长字节数组。
  • 其实我错了。 Fresco 让我降到了大约 90mb,这意味着 RAM 使用量减少了 10-20mb。图像部分已修复,但字节数组问题仍然存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-08
  • 1970-01-01
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多