我花了整整 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/
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序
我注意到类定义,如果我打开classMyClass,并在不覆盖的情况下添加一些东西我仍然得到了之前定义的原始方法。添加的新语句扩充了现有语句。但是对于方法定义,我仍然想要与类定义相同的行为,但是当我打开defmy_method时似乎,def中的现有语句和end被覆盖了,我需要重写一遍。那么有什么方法可以使方法定义的行为与定义相同,类似于super,但不一定是子类? 最佳答案 我想您正在寻找alias_method:classAalias_method:old_func,:funcdeffuncold_func#similartoca
是否可以在应用程序中包含的gem代码中知道应用程序的Rails文件系统根目录?这是gem来源的示例:moduleMyGemdefself.included(base)putsRails.root#returnnilendendActionController::Base.send:include,MyGem谢谢,抱歉我的英语不好 最佳答案 我发现解决类似问题的解决方案是使用railtie初始化程序包含我的模块。所以,在你的/lib/mygem/railtie.rbmoduleMyGemclassRailtie使用此代码,您的模块将在
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD