android应用程序的内存分配问题

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

但是当应用程序在应用程序中重复大约50次时(如图所示),它开始变得非常缓慢,直到应用程序和设备变得无法使用。 当设备重新启动并且应用程序再次打开时,它会照常运行。

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

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

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

效果极小,我理解IntentService管理自己关闭。 所以不知道我还能做些什么来尝试减少内存分配或者至少清除分配并停止添加它?

图像分析工作流程

更多细节:

  • 该应用程序正在使用基于Google Camera2的相机实现
  • 通过IntentService使用C ++库完成分析

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

你可以在这个博客上findJohan撰写的关于处理应用程序内存泄漏的文章,或者看看这个SO问题。

避免Android上的内存泄漏

如果在c ++库中生成内存泄漏,那么您可以轻松find在调试模式下泄漏内存的资源。

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

如果你能在问题中提供堆栈跟踪会很好。

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

我还会考虑使用threadPoolExecutor而不是intent服务,它们更易于配置https://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html

我想为Ali786的答案添加一些东西。

意图服务并不是真正重复出现的最佳选择。 下次调用服务时,它会进入队列。 Intent Services的工作方式与HandlerThreads类似。 他们有自己的MessageQueues,在用Intent启动服务后,它将等待前一个。

在UI线程上运行的普通服务并行运行。

在您将分析信息发送到您的活动后,我不确定您是否正在做某事,但如果您这样做,意图服务将不会死亡,下一个将不得不等待。 Intent服务不是与UI线程通信的最佳选择,Asynctask在您的情况下可能更好。 如果您向我们提供更多信息(代码),我们可以为您提供更准确的答案。 希望这可以帮助!

有一件事可能就是这样,如果你的工作意图服务完成后可能是你不破坏服务

签入运行服务列表的设置以运行应用程序的服务