安卓应用程序的内存分配问题

2022-09-01 16:14:15

我有一个执行图像分析的Android应用程序,该应用程序通过一个 - 该过程每次需要几秒钟,并且准确快速地工作。IntentService

但是,当该过程在应用程序中重复约50次(如图所示)时,它开始变得非常慢,直到应用程序和设备变得不可用。当设备重新启动并再次打开应用程序时,它会像往常一样运行。

使用Android Studio进行检查时,我可以看到每次运行分析时,应用程序的内存分配每次都会增加大约1MB。因此,当它崩溃时,它显然内存不足。

我已经在完成分析并转到结果以尝试修复后台活动时使用此标志;

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

这产生了很小的影响,我理解IntentService管理自己关闭。所以不确定我还能做些什么来尝试减少内存分配,或者至少清除向下分配并停止添加内存?

Image Analysis Workflow

更多详情:


答案 1

您似乎没有正确处理资源(变量,图像文件等),并在应用程序中创建内存泄漏。

您可以在Johan撰写的有关处理应用程序中的内存泄漏的博客中找到,或者查看此SO问题。

避免安卓系统上的内存泄漏

如果在 c++ 库中生成内存泄漏,则可以轻松找到在调试模式下泄漏内存的资源。

在结果活动之后,您应该按照Grisgram的建议调用垃圾回收器并关闭所有未使用的资源。

如果您可以在问题中提供堆栈跟踪,那就太好了。


答案 2

尝试使用 leakCanary https://github.com/square/leakcanary 找出导致泄漏的原因,并使用弱引用 https://developer.android.com/reference/java/lang/ref/WeakReference.html,以便在必要时对其进行垃圾回收。也可能是您使用的设备没有足够的内存来同时在内存中容纳50个高分辨率图像。如果您将图像保存在内存中,则可以尝试降低图像的分辨率,并确保正在回收位图 https://developer.android.com/topic/performance/graphics/manage-memory.html

我也会考虑使用 threadPoolExecutor 而不是 intent service,它们 https://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html


推荐