草庐IT

android - 通过 IClipboardDataPasteEventImpl 内存泄漏

coder 2023-11-23 原文

我注意到我的一项 Activity 中的内存异常增加。因此我进行了一些测试:我多次打开对话框(打开 - 关闭 - 打开 - 关闭......)并且内存不断增加。所以我使用 DDMS 转储 HPROF 文件并在 MAT 中打开它(内存分析器)。泄漏可疑报告表明,内存消耗增加的主要原因是:

所以我做了一个直方图,以检查我运行测试的那个对话框,以及是什么让它保持活跃。事实证明,它通过 AutoCompleteTextViews 保持 Activity 状态,而 android.widget.TextView$IClipboardDataPasteEventImpl 又保持 Activity 状态。 然而,IClipboardDataPasteEventImpl 没有直接的支配者(除了当然是 GC Root)。我试图在互联网上找到 IClipboardDataPasteEventImpl,并搜索了 grepcode(android 源代码),但我唯一能想到的就是这个 blog entry .我看不懂那是什么语言,但我能读到的是抛出的英文单词,这表明它可能是三星 Galaxy SII(我正在使用的手机,运行 android 2.3.x)上的一个错误,与剪贴板管理器相关。但是我不确定这一点(我想解决这个问题,因此我不愿意简单地接受它是一个无法修复的错误)并且我不知道这个剪贴板在哪里产生以及为什么产生。我将不胜感激关于此事的任何指示/想法。

最佳答案

调查

这是我的研究结果:

  • 它发生在内容 View 由 EditText 组成的任何 Activity 上。 finish()ing Activity 不会在引用时对其进行垃圾回收,如下所示:

    activity com.example.MyActivity
    <- mContext android.widget.TextView
        <- this$0 android.widget.TextView$IClipboardDataPasteEventImpl
            <- this$1 android.widget.TextView$IClipboardDataPasteEventImpl$1
                <- referent java.lang.ref.FinalizerReference
    
  • 它发生在我运行 Android 4.0.4Samsung Galaxy Tab GT-P7300 上,但不会发生在我的 Samsung Galaxy Mini GT-S5570 运行 Android 2.2.1

  • IClipboardDataPasteEventImpl 对象最终会被释放,实际上,但只是在似乎不可预测的时候。

由于它们被 java.lang.ref.FinalizerReference 引用,我相信 IClipboardDataPasteEventImpl 对象正在等待 finalize() 'd,只有当 JVM 愿意时才会发生。有关详细信息,请查看这些 SO 问题:


解决方案/解决方法

抱歉,没有解决方案,但这是我最好的解决方法:

ActivityonDestroy() 中,尽可能多地释放对其他对象的引用(尤其是大对象,例如位图、集合和您 Activity 的 subview ),像这样:

@Override
protected void onDestroy()
{
    // Free reference to large objects.
    m_SomeLargeObject = null;
    m_AnotherLargeObject = null;

    // For ArrayList, if you are a paranoid to null, you may call clear() and then trimToSize().
    m_SomeLargeArrayList.clear();
    m_SomeLargeArrayList.trimToSize();

    // Free child views.
    m_MyButton = null;

    // Free adapters.
    m_ListViewAdapter = null;

    ... etc.

    // Don't forget to chain the call to the superclass.
    super.onDestroy();
}

这样,我们至少可以减少伤亡,并希望在 JVM 有心情完成和收集所有那些邪恶的 IClipboardDataPasteEventImpl 对象之前不会内存不足。

在垃圾收集环境的理想世界中,这是不必要的,但我想我们都应该意识到我们的世界并不完美,我们只能忍受缺陷。


以下是我对 original blog entry 的翻译(中文)如问题中所述。希望这可以让大家更好地理解这个问题。

Galaxy S2 memory leak with TextView

不知道是不是哪邊弄錯

不知道哪里错了

但是galaxy s2的textview會產生memory leak

但是galaxy s2textview导致内存泄漏

leak是發生在android.widget.TextView$IClipboardDataPasteEventImpl這個interface上

泄漏 发生在 interface android.widget.TextView$IClipboardDataPasteEventImpl

它會抓住mContext造成整個activity沒辦法被gc

它持有mContext,阻止activitygc处理

同樣的程式在htc sensation(2.3.4)跟se xperia arc(2.3.4)和acer liquid(2.1)都沒有問題

htc sensation(2.3.4)se xperia arc(2.3.4)acer liquid(2.1) 上使用相同的应用程序没有这样的问题

而且網路上完全找不到android.widget.TextView$IClipboardDataPasteEventImpl相關的資料

而且,我在网上根本找不到与 android.widget.TextView$IClipboardDataPasteEventImpl 相关的任何内容

android source code裡也找不到 看起來應該是samsung自己加的東西...

甚至在android 源代码中也没有,所以它似乎是samsung 自己添加的...

之前的opengl viewport bug 已經夠頭痛了 接下來soundpool相關bug也搞累很多人

opengl viewport bug 已经很头疼了,soundpool 相关的bug 让很多人感到沮丧

現在這個memory leak又來攪局...

现在,内存泄漏来了……

看來手機外型還是比較重要 /_\... 外型好先吸到人來買 bug再慢慢修就好

看来手机的外观更重要/_\... 好的外观吸引顾客; bug 稍后可以修复


[後記]

[附言]

經過一些試驗發現 只要按HOME button回到桌面,那些leak就會被釋放掉...

经过一些测试,我发现按HOME 键 返回桌面可以解决漏洞...

logcat會顯示一行Hide Clipboard dialog at Starting input: finished by someone else... !

它在 logcat 中显示 Hide Clipboard 对话框 Starting input: finished by someone... !

看起來galaxy s2裡面有偷偷對clipboard作一些操作...

galaxy s2 似乎在引擎盖下的剪贴板 上运行...

但如果一直保持在app裡面運作的話,那些leak還是會存在...最後應該會發生OOM exception

但如果我们留在应用中,那些泄漏仍然存在......最终会发生OOM异常

現在只能期望galaxy s2 的ics版會修掉這個怪問題了...

现在我们只能希望这个奇怪的问题能在 galaxy s2ics 版本中得到解决...

关于android - 通过 IClipboardDataPasteEventImpl 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14135931/

有关android - 通过 IClipboardDataPasteEventImpl 内存泄漏的更多相关文章

  1. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  2. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  3. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  4. ruby - 通过 ruby​​ 进程共享变量 - 2

    我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是

  5. ruby - 通过 RVM (OSX Mountain Lion) 安装 Ruby 2.0.0-p247 时遇到问题 - 2

    我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search

  6. ruby-on-rails - Enumerator.new 如何处理已通过的 block ? - 2

    我在理解Enumerator.new方法的工作原理时遇到了一些困难。假设文档中的示例:fib=Enumerator.newdo|y|a=b=1loopdoy[1,1,2,3,5,8,13,21,34,55]循环中断条件在哪里,它如何知道循环应该迭代多少次(因为它没有任何明确的中断条件并且看起来像无限循环)? 最佳答案 Enumerator使用Fibers在内部。您的示例等效于:require'fiber'fiber=Fiber.newdoa=b=1loopdoFiber.yieldaa,b=b,a+bendend10.times.m

  7. ruby-on-rails - Ruby 中的内存模型 - 2

    ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序

  8. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  9. 通过 MacPorts 的 RubyGems 是个好主意吗? - 2

    从MB升级到新的MBP后,Apple的迁移助手没有移动我的gem。我这次是通过macports安装ruby​​gems,希望在下次升级时避免这种情况。有什么我应该注意的陷阱吗? 最佳答案 如果你想把你的gems安装在你的主目录中(在传输过程中应该复制过来,作为一个附带的好处,会让你以你自己的身份运行geminstall,而不是root),将gemhome:键设置为您在~/.gemrc中的主目录中的路径. 关于通过MacPorts的RubyGems是个好主意吗?,我们在StackOverf

  10. ruby - 通过 RVM 安装 Ruby 1.9.2 永远行不通! - 2

    当我执行>rvminstall1.9.2时一切顺利。然后我做>rvmuse1.9.2也很顺利。但是当涉及到ruby​​-v时..sam@sjones:~$rvminstall1.9.2/home/sam/.rvm/rubies/ruby-1.9.2-p136,thismaytakeawhiledependingonyourcpu(s)...ruby-1.9.2-p136-#fetchingruby-1.9.2-p136-#downloadingruby-1.9.2-p136,thismaytakeawhiledependingonyourconnection...%Total%Rece

随机推荐