- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我花了整整 4 天的时间尽我所能找出我正在开发的应用程序中的内存泄漏,但很久以前事情就变得毫无意义了。
我正在开发的应用程序具有社交性质,因此请考虑配置 Activity (P) 并使用数据列出 Activity - 例如徽章 (B)。您可以从个人资料跳到徽章列表,再到其他个人资料、其他列表等。
想象一下这样的流程 P1 -> B1 -> P2 -> B2 -> P3 -> B3 等。为了保持一致性,我正在加载同一用户的个人资料和徽章,因此每个 P 页面都是相同的每个B页也是如此。
问题的一般要点是:导航一段时间后,根据每个页面的大小,我在随机位置出现内存不足异常 - 位图、字符串等 - 它似乎没有保持一致。
在尽一切可能弄清楚我的内存不足的原因之后,我什么也没想到。我不明白的是,如果 Android 在加载时内存不足而是崩溃,为什么它不会杀死 P1、B1 等。如果我通过 onCreate() 和 onRestoreInstanceState() 回到它们,我希望这些早期的 Activity 会消亡并复活。
更不用说这个了 - 即使我执行 P1 -> B1 -> Back -> B1 -> Back -> B1,我仍然会崩溃。这表明存在某种内存泄漏,但即使在转储 hprof 并使用 MAT 和 JProfiler 之后,我也无法确定它。
我已禁用从网络加载图像(并增加了加载的测试数据以弥补它并使测试公平)并确保图像缓存使用 SoftReferences。 Android 实际上会尝试释放它拥有的少数 SoftReference,但就在它内存不足之前。
Badge 页面从 Web 获取数据,从 BaseAdapter 将其加载到 EntityData 数组中并将其提供给 ListView(我实际上使用的是 CommonsWare 的 excellent MergeAdapter,但在此 Badge Activity 中,实际上只有 1 个适配器无论如何,但我想以任何方式提及这个事实)。
我浏览了代码,但找不到任何会泄漏的东西。我清除并清空了所有我能找到的东西,甚至 System.gc() 左右,但应用程序仍然崩溃。
我仍然不明白为什么堆栈上的非 Activity Activity 没有得到收获,我真的很想弄清楚这一点。
此时,我正在寻找任何提示、建议、解决方案......任何可以提供帮助的东西。
谢谢。
最佳答案
I still don't understand why inactive activities that are on the stack don't get reaped, and I'd really love to figure that out.
事情不是这样运作的。影响 Activity 生命周期的唯一内存管理是所有进程的全局内存,因为 Android 认为它的内存不足,因此需要终止后台进程以获取一些内存。
如果您的应用程序在前台启动越来越多的 Activity ,它永远不会进入后台,因此它总是会在系统接近终止其进程之前达到其本地进程内存限制。 (当它确实终止其进程时,它会终止承载所有 Activity 的进程,包括当前处于前台的任何 Activity 。)
所以在我看来,您的基本问题是:您让太多 Activity 同时运行,和/或这些 Activity 中的每一个都占用了太多资源。
您只需重新设计您的导航,使其不依赖于堆积任意数量的潜在重量级 Activity 。除非您在 onStop() 中执行大量操作(例如调用 setContentView() 来清除 Activity 的 View 层次结构并清除它可能保留的任何其他变量),否则您只会耗尽内存。
您可能需要考虑使用新的 Fragment API 将这个任意堆栈的 Activity 替换为更紧密地管理其内存的单个 Activity。例如,如果你使用 Fragment 的回栈设施,当一个 Fragment 进入回栈并且不再可见时,会调用它的 onDestroyView() 方法来完全移除它的 View 层次结构,从而大大减少它的占用空间。
现在,只要您在按下返回、转到一个 Activity 、按下返回、转到另一个 Activity 等的流程中崩溃并且永远不会有深堆栈,那么是的,您只是有泄漏。这篇博文描述了如何调试泄漏:http://android-developers.blogspot.com/2011/03/memory-analysis-for-android.html
关于Android 应用程序内存不足问题 - 尝试了所有方法,但仍然一头雾水,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7536988/
说真的,你怎么能在不发疯的情况下处理所有这些异常呢?我是不是读了太多关于异常处理的文章或什么?我尝试重构了几次,但每次似乎都以更糟糕的结果告终。也许我应该承认确实会发生异常(exception)情况,
背景 两者 try/rescue和 try/catch是 Elixir 中的错误处理技术。根据 corresponding chapter在介绍指南中。 Errors can be rescued u
每当我尝试在 Raspberry PI 上运行此 python 脚本时,我都会遇到问题: import socket import sys # Create a TCP/IP socket sock
我想知道一些关于 PHP 的 try , catch声明。 让我们考虑以下示例。 abstract class ExceptionA extends Exception {} class Except
我的 laravel v5.4 项目中有两个模型,user 和 admin。 在 config/auth.php 中,我向守卫和提供者添加了管理员,如下所示: 'guards' => [ 'w
try: r = requests.get(url, params={'s': thing}) except requests.ConnectionError, e: print e
我有以下代码。 但是,它并不能捕获所有错误,而我仍然会收到“throw er;//未处理的'错误'事件”。 为什么是这样? app.post('/api/properties/zip/:zip/bed
问题与细节 我正在使用自定义错误处理,遇到的错误之一是“路径中的非法字符”。我有一个自定义函数,旨在通过路径字符串查找此类非法字符,并在找到它们时引发自定义错误。但是我发现,取决于非法字符,Test-
This question already has answers here: How do I catch a numpy warning like it's an exception (not j
我正在使用其他人的代码,但我不熟悉try/catch,因此我举了一个类似的小例子。在第11行上,如果我写了error(''),似乎没有发现错误并增加了索引j。但是,编写error(' ')或error
我在我的一个程序中遇到了这个问题,在这种情况下,尝试/异常(exception)的错误使程序变得更好,以防用户意外输入了他们不应该输入的内容。它仍然给我错误,我为为什么感到困惑。如果对我的问题确实很重
我在尝试TRY ... CATCH块时遇到问题。有人可以解释为什么以下代码无法执行我的sp吗? DECLARE @Result int SET @Result = 0 BEGIN TRY SE
我有一个相当大的 powershell 脚本,其中包含许多(20 多个)执行各种操作的函数。 现在所有代码实际上都没有任何错误处理或重试功能。如果某个特定的任务/功能失败,它就会失败并继续。 我想改进
为什么我尝试时需要导入 inputmismatchException catch(InputMismatchException e){ System.out.println("
我对此感到困惑 - 我为辅助方法编写了一个 try/catch 。它的目的是捕获任何无效输入(任何不是“男性”或“女性”的内容(没有特定情况)。如果输入无效,它将通知用户,然后让他们重试。如果有效,则
我有时会发现自己处于如下场景。尽可能简单地陈述问题 “有时我会创建一段代码,Java 让我将其包含在 try/catch 语句中。我没有使用 catch,所以我将其留空。为什么这是错误的?” boo
我有点困惑为什么当我不使用 Try block 时会出现 Try block 错误。 我在代码块底部附近收到错误通知。如果我不使用 try/catch,有人可以向我解释为什么会发生这种情况吗? 它是否
我已经盯着我的电脑两个小时了,我不知道我做错了什么。谁能帮助我看到光明? package blackjack; import java.util.Random; import java.util.Sc
我想将方法保存在 Enum 中,但 Class.getDeclaredMethod 抛出 NoSuchMethodException,那么我该如何处理呢?我的代码: public enum Car
这个问题已经有答案了: Executing multi-line statements in the one-line command-line (18 个回答) 已关闭 3 年前。 如何使用try.
我是一名优秀的程序员,十分优秀!