Android 6:应用程序每次启动时都会使用更多的内存

三星Galaxy S6与Android 6.0.0和6.0.1

我的应用运行良好,代码分析显示没有内存泄漏。 SmartManager显示该应用程序使用〜40MB的内存。 我杀了应用程序(使用“当前正在运行的应用程序”概述—不知道这是怎么用英文调用,对不起,手机左下angular的键,显示所有正在运行的应用程序的微缩列表…) ,然后再次启动它。

现在,SmartManager不再为我的应用显示〜40MB的内存,但…更多。 50. 100. 400.每次都变化,但是增长。 过了一段时间,我的应用程序实际上崩溃了一个OutOfMemoryException 。 有时甚至在尝试抛出OutOfMemoryException时出现“内存不足”…

我必须卸载并重新安装应用程序,以重置其内存消耗。 在我testing过的所有其他手机上,相同的APKperformance正确(例如S5和Android 5.0)。 不知道是什么原因造成的。 不知道是什么原因造成的! 任何帮助/提示/build议…?

编辑:与Android 6.0.1在S5上相同的行为,但与Android 5.0的S5 没有

Edit2:谢谢大家的贡献。 我还没有一个满意的答案,但是我提到了一些想法。 大多数人都关注MemLeak问题,虽然这听起来很合理,但我想强调的是,在Android 4或5上没有发生泄漏,只有6.(我还没有testing7.)此外,泄漏只发生当我强行杀死应用程序(我有时需要做testing正确的closures和重新启动行为),只有没有附加debugging器(这使得testing/debugging这种行为在背面疼痛)。

该应用程序启动一个服务作为绑定服务 。 绑定到应用程序上下文—根据文档应该在应用程序停止时自行清理。 不幸的是,这笔赏金的时间已经不多了。 到目前为止,上述服务似乎是我的问题最可能的来源。 因此,我将授予卡马尔赏金,因为他是第一个在评论和答复中提到这一点的人。 你们其余的人,非常感谢你们,并投票赞成。

Solutions Collecting From Web of "Android 6:应用程序每次启动时都会使用更多的内存"

分析你的代码和图像,如果有什么错误,你自己做。 像绘制非常大的图像。 确保您正确实施回收站或列表视图。 以下链接可能对您有所帮助。

  • 使用leakcanary库来检测并确保没有泄漏

  • 检测用户从新兴应用程序中杀死应用程序

  • 从内存显示器调用gc自带Android Studio以获取正确的内存使用值导致gc不能频繁运行。

  • 使用大堆大小。 <application android:largeHeap="true"

  • 使用应用程序上下文启动服务
    startService(new Intent(getApplicationContext(),MyService.class));

在Android Studio中,点击屏幕底部的Android Monitor 。 点击标签Monitors 。 您会看到您的应用使用的内存图。 现在点击垃圾箱旁边的Dump Java Heap 。 系统开始收集信息并创build转储文件。 您可以在Android Studio窗口右上angular的“ Analyze Tasks选项卡中打开该文件。 按绿色箭头查找泄漏内存的类。 当你点击泄漏的活动时,你会看到一个窗口Reference Tree 。 穿过树,find深度为零的成员。 这是内存泄漏。

您的应用程序有一些线程是一次又一次创build的计时器任务,他们正在利用许多与networking相关的资源,所以您的堆大小不断增加,并且在某些时候,您的应用程序内存不足,崩溃。

有人认为任务杀手在Android上很重要。 通过closures在后台运行的应用程序,您将获得改善的性能和电池寿命 – 无论如何,这就是想法。 实际上,任务杀手可以降低你的性能.Android不是Windows,不像Windows那样pipe理进程。 与在Windows上closures应用程序有明显的方法不同,没有明显的方式来“closures”Android应用程序。 这是devise,而不是一个问题。当你离开一个Android应用程序,回到你的主屏幕或切换到另一个应用程序,该应用程序在后台保持“运行”。 在大多数情况下,应用程序将在后台暂停,不占用CPU或networking资源。 有些应用程序会在后台继续使用CPU和networking资源,例如,音乐播放器,文件下载程序或在后台同步的应用程序。当您返回最近使用的应用程序时,Android“unpauses “那个应用程序,你恢复你离开的地方。 这很快,因为应用程序仍然存储在您的RAM中,并准备再次使用,因此不消耗更多的资源。

像聪明的经理这样的任务杀手认为他们比Android更好。 他们在后台运行,自动退出应用程序,并从Android的内存中删除它们。 他们也可能允许你自己强制退出应用程序,但你不应该这样做正常。如果一个任务杀手从你的RAM中删除一个应用程序,并再次打开该应用程序,该应用程序将加载速度较慢Android不得不从设备的存储中加载它。此外,s6还具有智能pipe理器,可用作电池和存储设置的小部件或快捷方式,但是应避免使用“全部清理”优化function。 据说这个function可以提高设备的性能,就像Clean Master应用程序所做的那样 – 但是它的实际影响是值得怀疑的。

意思,尽pipe有时候你杀了一个应用程序它仍然可以留下堆的痕迹,所以下次启动时,它会显示不同的更多的存储使用量,也失败了默认maxMemory()的概念,应用程序最终可能会崩溃。进一步的泄漏难以追踪,因为它们并不是直接与你在第一时间遇害的应用程序相关联。但是有时甚至在杀死应用程序之后,某些function(如获得的资源)可能仍然在后台运行,甚至连应用程序都不知道它们。不明显的泄漏。所以你可能想使用maxMemory()

可以调用它(例如,在您的主要活动的onCreate()方法中),如下所示:

 Runtime rt = Runtime.getRuntime(); long maxMemory = rt.maxMemory(); Log.v("onCreate", "maxMemory:" + Long.toString(maxMemory)); 

这个方法告诉你允许你的应用程序使用多less堆字节。 最佳行为:应用程序可以在后台保持“运行”状态,而不需要任何进程占用手机资源。 Android将应用程序保存在内存中,以便更快地启动并返回到之前的状态。 当您的手机内存不足时,Android将自动开始自行查杀任务,从一段时间内没有使用过的开始。 你应该做什么,而不是

也就是说,并不是所有的应用程序都是一样的 过去你们中的许多人曾经使用过任务杀手,实际上发现在释放内存之后,你的手机会更好一些。 这更可能是因为你已经杀死了一个糟糕的应用程序,并且(例如)不断尝试连接到互联网,即使它不应该。 你所经历的任何性能提升更有可能是因为你杀了正确的应用程序,而不是因为你释放了大量的内存(或在很多情况下,它只是安慰剂)。 而不是杀死所有这些应用程序,找出哪些是真正导致问题。使用任务杀手来处理一个行为不当的应用程序就像使用霰弹枪杀死苍蝇 – 你可以解决你的问题,但你造成了很多现在S6已经有3个ram了,所以应该没有问题,但是智能pipe理器的实现可能会导致一些应用程序出现问题,而不一定是android版本的依赖。也就是说,heapsize更倾向于基于更多屏幕分辨率,因为更高分辨率的屏幕倾向于操纵更大的位图。 在这种情况下,不要使用任务杀手,而应该识别出错误的应用程序并将其卸载,或者对其进行debugging,并将其replace为可正常工作的应用程序。 要locking那个行为不当的应用程序,可以尝试一下

看门狗任务pipe理器应用程序

– 它会告诉你哪些应用程序实际上是在后台使用CPU,而不是将哪些应用程序无害地存储在内存中。

迷人的事实:

CyanogenMod,stream行的社区开发的Android ROM,甚至不接受使用任务杀手的用户的错误报告,说他们导致更多的问题比他们解决。

问题的可能原因

如果您可以尝试一下,首先进入设置>声音和通知>应用程序通知>select智能pipe理器,并select隐藏locking屏幕上的内容

然后再回到设置进入锁屏和安全>设备安全>禁用KNOX主动保护,并停用KNOX主动保护下的防恶意软件选项

在locking屏幕和安全转到其他安全设置>禁用发送安全报告,并下降到ussage数据访问>禁用智能pipe理器,所以之后,重新启动您的设备。现在看看该应用程序是否工作还请参阅性能问题与S6