我注意到在我的活动之一奇数内存增加。 因此,我跑了一个小测试:我的对话框多次打开(打开 - 关闭 - 打开 - 关闭....)和内存不断增加。 所以我用DDMS来转储HPROF文件,并打开它MAT (内存分析器)。 泄漏可疑报告指出,对于日益增长的内存消耗的主要原因是这样的:
所以,我做了一个直方图,检查对话框我跑我的测试上,什么是保持它活着。 事实证明,通过它的AutoCompleteTextViews,而这又是通过android.widget.TextView $ IClipboardDataPasteEventImpl更让它是维持生命。 不过也有对IClipboardDataPasteEventImpl没有直接的支配者(除GC根的课程)。 我试图找到在互联网上IClipboardDataPasteEventImpl和我搜索grepcode(Android的源),但我能想出的唯一的事情是这样的博客条目 。 我不能阅读任何一种语言就是,但我能读的甩在了英语单词,这表明,这可能是对三星Galaxy SII的错误(我使用的手机,运行Android 2.3.x版本)有关ClipboardManager。 但是我不确定这(我想解决这个问题,所以我不愿意简单地接受它是一个无法修复的bug),我不知道,在这个剪贴板催生和原因。 我将不胜感激对此事的任何指针/想法。
我memleak调查也把我带到这里。 即时通讯具有活动泄漏了的EditText问题。 android.widget.TextView $ IClipboardDataPasteEventImpl对象是持有其持有的活动的EditText。 这种情况在三星Galaxy Tab 10.1和Galaxy Tab的2 10.1,7.0。 我无法重现它在其他非三星设备(华硕,宏碁)。
坏事是,我没有为它找到一个解决方案尚未:)
调查
我这里还有我的研究成果:
它发生在任何Activity
,其内容视图包含一个的EditText
。 finish()
荷兰国际集团的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
,停止activity
被GC“版
同样的程式在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的解决...