通过IClipboardDataPasteEventImpl内存泄漏(Memory leak thr

2019-08-05 10:28发布

我注意到在我的活动之一奇数内存增加。 因此,我跑了一个小测试:我的对话框多次打开(打开 - 关闭 - 打开 - 关闭....)和内存不断增加。 所以我用DDMS来转储HPROF文件,并打开它MAT (内存分析器)。 泄漏可疑报告指出,对于日益增长的内存消耗的主要原因是这样的:

所以,我做了一个直方图,检查对话框我跑我的测试上,什么是保持它活着。 事实证明,通过它的AutoCompleteTextViews,而这又是通过android.widget.TextView $ IClipboardDataPasteEventImpl更让它是维持生命 不过也有对IClipboardDataPasteEventImpl没有直接的支配者(除GC根的课程)。 我试图找到在互联网上IClipboardDataPasteEventImpl和我搜索grepcode(Android的源),但我能想出的唯一的事情是这样的博客条目 。 我不能阅读任何一种语言就是,但我能读的甩在了英语单词,这表明,这可能是对三星Galaxy SII的错误(我使用的手机,运行Android 2.3.x版本)有关ClipboardManager。 但是我不确定这(我想解决这个问题,所以我不愿意简单地接受它是一个无法修复的bug),我不知道,在这个剪贴板催生和原因。 我将不胜感激对此事的任何指针/想法。

Answer 1:

我memleak调查也把我带到这里。 即时通讯具有活动泄漏了的EditText问题。 android.widget.TextView $ IClipboardDataPasteEventImpl对象是持有其持有的活动的EditText。 这种情况在三星Galaxy Tab 10.1和Galaxy Tab的2 10.1,7.0。 我无法重现它在其他非三星设备(华硕,宏碁)。

坏事是,我没有为它找到一个解决方案尚未:)



Answer 2:

调查

我这里还有我的研究成果:

  • 它发生在任何Activity ,其内容视图包含一个的EditTextfinish()荷兰国际集团的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 
  • 它发生在我的三星Galaxy Tab GT-P7300运行Android 4.0.4,但不是我的三星Galaxy迷你GT-S5570运行Android 2.2.1。

  • IClipboardDataPasteEventImpl对象最终获得解脱出来,其实,只是在时间,这似乎是不可预知的。

由于它们是通过引用java.lang.ref.FinalizerReference ,我相信IClipboardDataPasteEventImpl对象正在等待finalize() “d,这恰好只有当JVM感觉就像。 有关详细信息,请查看这些所谓的问题:

  • 是内存泄漏? 为什么java.lang.ref.Finalizer吃那么多内存
  • 很奇怪的OutOfMemoryError

解决方案/解决方法

对不起,没有办法解决,但这里是我最好的解决方法:

onDestroy()你的Activity ,对其他对象越好 (特别是大的,如位图,集合和你的活动的子视图),像这样的免费许多参考资料

@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有心情finialize并收集所有那些邪恶的前IClipboardDataPasteEventImpl对象。

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


下面是我的翻译原来的博客文章中提到的问题(在中国)。 希望这可以给大家对这个问题的了解。

Galaxy S2 memory leak with TextView

不知道是不是哪边弄错

不知道哪里出了问题

但是galaxy s2的textview会产生memory leak

但是textview 银河S2会导致内存泄漏

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的感觉相同的应用程序(2.3.4),SE XPERIA弧(2.3.4)宏碁Liquid(2.1)

而且网路上完全找不到android.widget.TextView$IClipboardDataPasteEventImpl相关的资料

而且,我也找不到相关的任何android.widget.TextView$IClipboardDataPasteEventImpl在网络上的所有

android source code里也找不到看起来应该是samsung自己加的东西...

甚至在Android源代码 ,因此它似乎有什么东西是三星自己加...

之前的opengl viewport bug 已经够头痛了接下来soundpool相关bug也搞累很多人

OpenGL视口的bug很是头疼不已,和的Soundpool相关的bug已经受挫很多

现在这个memory leak又来搅局...

而现在,这里来了内存泄漏瞎搞......

看来手机外型还是比较重要/_\... 外型好先吸到人来买bug再慢慢修就好

看来,手机的外观更重要/ _ \ ...良好的外观吸引顾客; 错误以后可以固定


[后记]

[PS]

经过一些试验发现只要按HOME button回到桌面,那些leak就会被释放掉...

一些测试后,我发现泄漏会按HOME键回到桌面被释放......

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

它显示隐藏剪贴板对话在开始输入:由别人完成...!logcat的

看起来galaxy s2里面有偷偷对clipboard作一些操作...

看来, 银河S2是在引擎盖下剪贴板操作...

但如果一直保持在app里面运作的话,那些leak还是会存在...最后应该会发生OOM exception

但是,如果我们停留在应用程序 ,这些泄漏留......最终会发生OOM异常

现在只能期望galaxy s2 的ics版会修掉这个怪问题了...

现在我们只能希望这个奇怪的问题将在ICS版本的Galaxy S2的解决...



文章来源: Memory leak through IClipboardDataPasteEventImpl