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

时间:2017-02-05 16:06:57

标签: java android android-camera2

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

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

使用Android Studio进行检查我可以看到,每次运行分析时,应用程序的内存分配每次都会上升 1MB 。所以当它崩溃时显然会耗尽内存。

我在完成分析并使用此标志时尝试修复后台活动;

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

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

Image Analysis Workflow

进一步详情:

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

4 个答案:

答案 0 :(得分:10)

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

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

Avoid memory leaks on Android

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

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

如果您能在问题中提供堆栈跟踪,那将是件好事。

答案 1 :(得分:2)

尝试使用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

答案 2 :(得分:1)

我想在Ali786的答案中添加一些内容。

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

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

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

答案 3 :(得分:0)

有一件事情可能就是这样,如果你的工作意向服务完成后可能是你的服务

检入运行服务列表的设置以运行应用服务