调查
以下是我的研究结果:
它发生在任何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
它发生在运行Android 4.0.4的 Samsung Galaxy Tab GT-P7300上,但不会发生在运行Android 2.2.1的 Samsung Galaxy Mini GT-S5570上。
- 实际上,这些
IClipboardDataPasteEventImpl
对象最终会被释放,但只是有时似乎是不可预测的。
由于它们被 引用java.lang.ref.FinalizerReference
,我相信这些IClipboardDataPasteEventImpl
对象正在等待被finalize()
'd,这仅在 JVM 愿意时才会发生。有关详细信息,请查看以下 SO 问题:
解决方案/解决方法
抱歉,没有解决方案,但这是我最好的解决方法:
在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();
}
IClipboardDataPasteEventImpl
这样,我们至少可以减少伤亡,并希望在 JVM 有心情完成并收集所有这些邪恶的对象之前不会出现内存不足。
在垃圾收集环境的理想世界中,这是不必要的,但我想我们都应该意识到我们的世界并不完美,我们只能忍受这些缺陷。
以下是我对问题中提到的原始博客条目(中文)的翻译。希望这可以让大家更好地理解这个问题。
带有 TextView 的 Galaxy S2 内存泄漏
不知道是不是哪弄边错
不知道哪里出错了
但是galaxy s2的textview会产生内存泄漏
但是galaxy s2会导致textview
内存泄漏
泄漏是发生在android.widget.TextView$IClipboardDataPasteEventImpl这个接口上</p>
泄漏发生在interface
android.widget.TextView$IClipboardDataPasteEventImpl
它会抓住mContext造成整个活动没办法被gc
它持有mContext
, 阻止activity
被gc 'ed
的程序在htc sense(2.3.4)跟se xperia arc(2.3.4)和acer liquid(2.1)都没有问题</p>
在htc sense(2.3.4)、se xperia arc(2.3.4)和acer liquid(2.1)上使用相同的应用程序没有这样的问题
网路上完全找不到android.widget.TextView$IClipboardDataPasteEventImpl相关的资料</p>
android.widget.TextView$IClipboardDataPasteEventImpl
而且,我在网上根本找不到任何相关的东西
android源代码里也找不到看起来应该是三星自己加的东西...
甚至在android源代码中也没有,所以它似乎是三星自己添加的东西......
之前的opengl viewport bug 已经够头痛了
opengl viewport 的 bug已经很让人头疼了,soundpool相关的bug让很多人感到沮丧
现在这个内存泄漏又来困扰局...
现在,这里出现了内存泄漏问题......
看来手机外型还是比较重要的 /_\... 外型好先到人来买虫子再慢慢吸修就好了
看来手机的外观更重要/_\...好看的外观吸引顾客;错误可以稍后修复
[后记]
[PS]
一些试验立即按HOME按钮回到桌面,那些leak被释放掉...
经过一些测试,我发现可以通过按HOME 按钮返回桌面来释放泄漏...
logcat会显示一行在开始输入时隐藏剪贴板对话框:由其他人完成...!
它在开始输入时显示隐藏剪贴板对话框:由其他人完成...!在日志中
看起来 galaxy s2 里面有偷偷对剪贴板做一些操作...
似乎galaxy s2正在引擎盖下的剪贴板上运行......
但如果一直保持在应用程序里面准许的话,那些泄漏还是会存在……最后应该会发生OOM异常
但是如果我们留在应用程序中,这些泄漏仍然存在……最终会发生OOM 异常
现在只能修改galaxy s2的ics版会掉这个订婚怪问题了……
现在我们只能希望这个奇怪的问题能在galaxy s2的ics版本中得到解决……