11

配备 Android 6.0.0 和 6.0.1 的三星 Galaxy S6

我的应用程序运行良好,代码分析显示没有内存泄漏。SmartManager 显示该应用程序使用了约 40MB 的内存。我杀死了应用程序(使用“当前正在运行的应用程序”概述 --- 不知道用英语怎么说,抱歉。手机左下角的键,显示所有正在运行的应用程序的缩影列表......) ,然后重新开始。

现在 SmartManager 不再为我的应用显示约 40MB 的内存,而是……更多。50. 100. 400. 它各不相同,但每次都在增长。过了一会儿,我的应用程序实际上崩溃OutOfMemoryException。有时甚至“在尝试抛出 OutOfMemoryException 时内存不足”......

我必须卸载并重新安装该应用程序才能重置其内存消耗。相同的 APK 在我测试过的所有其他手机上都能正常运行(例如 S5 和 Android 5.0)。不知道是什么原因造成的。不知道是什么原因造成的!任何帮助/提示/建议...?

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

Edit2:谢谢,所有贡献的人。我仍然没有满意的答案,但提到了一些我会研究的想法。大多数人都关注 MemLeak 问题,虽然这听起来很合理,但我想强调的是,Android 4 或 5 上没有发生泄漏,只有 6 个。(我还没有测试 7。)而且,泄漏只发生当我强行杀死应用程序时(有时我需要这样做以测试正确的关闭和重新启动行为),并且只有在没有附加调试器的情况下(这使得测试/调试这种行为在背后变得很痛苦)。

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

4

4 回答 4

3

在 Android Studio 中,单击Android Monitor屏幕底部的 。单击选项卡Monitors。您会看到应用程序使用的内存图表。现在单击Dump Java Heap垃圾车旁边的项目。系统开始收集信息并创建转储文件。Analyze Tasks您可以在 Android Studio 窗口右上角的选项卡中打开该文件。按绿色箭头查找泄漏内存的类。当您单击泄漏的活动时,您会看到一个窗口Reference Tree。遍历树,找到深度为零的成员。这就是内存泄漏。

于 2016-12-01T14:31:28.327 回答
2

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

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

  • 检测用户何时从最近的应用程序中杀死应用程序

  • 从内存监视器调用 gc 与 Android Studio 一起提供正确的内存使用值,因为 gc 不经常运行。

  • 使用大堆大小。 <application android:largeHeap="true"在清单中

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

于 2016-12-01T10:31:01.250 回答
1

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

像聪明的经理这样的任务杀手认为他们比 Android 更了解。它们在后台运行,自动退出应用程序并将它们从 Android 的内存中删除。它们也可能允许您自行强制退出应用程序,但您不必正常执行此操作。如果任务杀手从您的 RAM 中删除了一个应用程序,然后您再次打开该应用程序,该应用程序的加载速度会变慢,因为Android 被迫从设备的存储中加载它。Further s6 具有智能管理器,可用作小部件或电池和存储设置的快捷方式,但您应避免使用“全部清除”优化功能。据说此功能可以提高设备性能——正如 Clean Master 应用程序的目标一样——但它的实际影响值得怀疑。

这意味着虽然有时您仍然会杀死一个应用程序,但它仍然可以在堆上留下痕迹,因此下次启动它时,它会显示使用的存储量不同,这也违反了默认概念,maxMemory()应用程序最终可能会崩溃。进一步的此类泄漏很难跟踪,因为它们与您在第一次杀死的应用程序没有直接关联。但有时即使在杀死应用程序后,某些功能(如获得的资源)可能会继续在后台运行,甚至应用程序甚至都不知道它们。即不明显的泄漏。因此,您可能想使用 maxMemory()

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

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

此方法告诉您您的应用程序允许使用的堆总字节数。 最佳行为: 应用程序可以在后台保持“运行”,而不会有任何进程占用您手机的资源。Android 将应用程序保存在其内存中,因此它可以更快地启动并返回到之前的状态。当您的手机内存不足时,Android 会自动开始自行杀死任务,从您一段时间未使用的任务开始。 你应该做什么

也就是说,并非所有应用程序都是平等的。你们中的许多人过去使用过任务杀手,实际上发现在释放内存后,你的手机工作得更好一些。这更有可能是因为您杀死了一个编码不良的不良应用程序,并且(例如)即使不应该连接到互联网,也会继续尝试连接。您体验到的任何性能提升更有可能是因为您杀死了正确的应用程序,而不是因为您释放了大量内存(或者,在许多情况下,这只是安慰剂)。与其杀死所有这些应用程序,不如找出真正导致问题的应用程序。使用任务杀手来处理行为不端的应用程序就像使用霰弹枪杀死苍蝇一样——您可能会解决问题,但会造成很多问题过程中的其他损坏。现在由于 S6 有 3 gigs ram,它应该没有问题,然而,智能管理器的实现可能会导致某些应用程序出现问题,并且不一定依赖于 android 版本。此外,heapsize 往往更多地基于屏幕分辨率,因为更高分辨率的屏幕往往想要操作更大的位图。在这种情况下,您不应使用任务杀手,而应识别不良应用程序并将其卸载,或对其进行调试,然后将其替换为正常运行的应用程序。要确定行为不端的应用程序,您可以尝试 用正常运行的应用程序替换它。要确定行为不端的应用程序,您可以尝试 用正常运行的应用程序替换它。要确定行为不端的应用程序,您可以尝试

看门狗任务管理器应用

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

迷人的事实:

CyanogenMod 是流行的社区开发的 Android ROM,它甚至不接受用户使用任务杀手的错误报告,称它们造成的问题比解决的问题多。

问题的可能原因

如果您可以尝试立即关注,首先进入设置>声音和通知>应用程序通知>选择智能管理器并选择在锁定屏幕上隐藏内容

然后再次返回设置转到锁屏和安全>设备安全>禁用 KNOX 主动保护并停用 KNOX 主动保护下方的反恶意软件选项

在锁定屏幕和安全中转到其他安全设置>禁用发送安全报告并转到使用数据访问>禁用智能管理器,然后重新启动您的设备。现在查看应用程序是否正常工作另请参阅 s6 的性能问题

于 2016-12-01T17:02:44.610 回答
1

您的应用程序有一些线程是一次又一次地创建的计时器任务,它们正在利用与网络相关的许多资源,因此您的堆大小不断增加,有时您的应用程序内存不足并崩溃。

于 2016-12-01T14:23:47.193 回答