最大限度减少高 RAM 使用率的方法

问题描述 投票:0回答:3

我目前正在开发一个应用程序,它具有非常高的内存占用,并且非常面向内容。我有多达数百个“提交”,每个提交都可能有一个小缩略图或大位图图像,以及可能包含 40-50 个数据字符串的数组列表,所有这些都在一个活动内,其中可能有多个。目前它使用的 RAM 超过 150MB,许多用户抱怨由于内存不足而导致崩溃。使用一段时间后也会变得迟缓,我正在努力改善。

我目前正在使用 1/8 的可用内存用于图像的 LruCache,并且在每次提交的片段中,我都会加载一个字符串列表,该列表会在每次提交时进入一个数组。如果我尝试检索图像但图像不存在,我会加载一个新图像并将其放回缓存中,这工作正常,但我仍然使用大量内存。缓存是静态的,在我的所有活动之间共享,所以这不是问题。在片段中包含一个包含许多子视图的字符串数组会增加我的内存问题吗?

我可以采取哪些步骤来最大限度地减少内存使用并加快我的应用程序的速度?

谢谢!

android arrays memory bitmap
3个回答
1
投票

Gabe 所说的,是你应该做的事情,但除此之外,让我给你一个可以采取的方法。

首先,这 40-50 个字符串本身并不会导致 RAM 问题(除非存在内存泄漏)。位图是罪魁祸首。

我强烈建议使用像 Volley 这样的库来上传数据,因为这本身会改善内存管理。接下来,检查代码并确定您将位图/可绘制变量保留在范围内的时间是否超过了所需的时间。如果是的话,消灭它们。

此外,如果要上传多个图像,请将它们排队。将排队的图像保存在缓存或应用程序数据中,轮到时检索它们、上传它们,并从其位置清除中间保存的图像。


1
投票

我的笔记本电脑上装有 Windows 10、8 GB RAM、1 TB HDD,即使处于空闲状态,它也会持续消耗超过 50% 的内存。 我必须寻找并解决这个问题一段时间,但我逐渐知道了一些确实有帮助的好解决方案。

要做的事:

  • 您可以在不玩游戏时禁用 Xbox 游戏栏。在任务管理器中可以看到它的进程名称是“Service Host: Game-DVR”,也可以在那里结束。这个过程特别消耗大量内存。
  • 您可以将默认的防病毒软件(Windows Defender)更改为其他软件,这样消耗的内存更少。禁用防守者也是一种选择,但不是一个好主意。仍然记得保持防火墙始终打开,以避免任何不必要的问题。
  • 您可以禁用不需要的启动进程。
  • 请记住关闭浏览器中任何不必要的选项卡。浏览器是 RAM 的大消耗者。
  • 您可以关闭服务主机:sysmain进程,但我不确定这是否会损害性能。对我来说,我发现这没有什么坏处,但唯一的问题是它在几分钟内再次弹出。

不该做的事:

  • 永远不要更改您的分页设置或类似的内容,这可能是互联网上的一些解决方案。这感觉是一个解决方案,但会花费额外的 CPU 周期和磁盘使用量,这肯定会适得其反。

0
投票

我可以告诉您,我将能够帮助您减少内存浪费并提高应用程序的性能。您可以想到的一些替代方案是:

图像优化:

缩小图像:采用合适的图像格式,例如用于图片的 JPEG、用于图形的 PNG 等以及合理节省文件大小的图像压缩级别。

搜索维护:不要在不可见的地方预加载占用太多内存的图像。

图像缓存:采用更强大的缓存机制,与更多空间图像相比,该机制将丢弃较少使用的图像以节省内存。您可能会考虑像 Glide 或 Picasso 这样的库,它们具有更好的图像处理功能。

位图重用:如果使用多个视图同时显示相同的图像,则可以使用相同的位图实例来加载不同的图像,从而使该过程消耗更少的内存。

数据结构优化:

SparseArrays:如果您正在处理大量键值对,请使用 SparseArrays 而不是 HashMap,因为它们不会浪费内存。

回收视图:在 RecyclerView 适配器中,实现 ViewHolder 模式,以便当视图不再使用时,它会被存储和重用,而不是创建新视图。

避免不必要的对象:懦弱的少数编程没有机会创建不必要的临时对象,尤其是对于循环。

活动和片段管理:

避免创建片段:如果不需要创建新片段,请避免每次创建新片段,确保使用现有的片段。

正确的生命周期管理:确保片段和活动在未完成的情况下不会暂停

© www.soinside.com 2019 - 2024. All rights reserved.