Android EditText GC_CONCURRENT

时间:2013-08-12 06:51:51

标签: android garbage-collection android-edittext

我有一些什么都不做的EditTexts。我跳过所有听众和过滤器以查看清晰的图片。 EditText具有下一个结构:

EditText et1 = new EditText(this);
et1.setId(num+1); 
RelativeLayout.LayoutParams etp =  new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
etp.addRule(RelativeLayout.LEFT_OF,et2.getId());
etp.addRule(RelativeLayout.BELOW,et3.getId());
etp.setMargins(0, 0, 5, 5);
et1.setLayoutParams(etp);
et1.setBackgroundResource(R.drawable.someXMLDrawable);

RelativeLayout content = new RelativeLayout(this);
content.addView(et1);

当我点击EditText时,它会运行垃圾收集器。如果从一个字段点击到另一个字段,我将得到下一张图片:

D/dalvikvm(387): GC_CONCURRENT freed 1513K, 43% free 10451K/18055K, paused 1ms+3ms
I/dalvikvm-heap(387): Grow heap (frag case) to 13.731MB for 1190416-byte allocation
D/dalvikvm(387): GC_CONCURRENT freed 1525K, 43% free 10451K/18055K, paused 2ms+2ms
I/dalvikvm-heap(387): Grow heap (frag case) to 13.729MB for 1190416-byte allocation
D/dalvikvm(387): GC_CONCURRENT freed 1438K, 42% free 10540K/18055K, paused 2ms+2ms
I/dalvikvm-heap(387): Grow heap (frag case) to 13.723MB for 1190416-byte allocation
D/dalvikvm(387): GC_CONCURRENT freed 1436K, 42% free 10540K/18055K, paused 2ms+3ms
I/dalvikvm-heap(387): Grow heap (frag case) to 13.720MB for 1190416-byte allocation
D/dalvikvm(387): GC_CONCURRENT freed 1432K, 42% free 10540K/18055K, paused 1ms+3ms
I/dalvikvm-heap(387): Grow heap (frag case) to 13.721MB for 1190416-byte allocation
D/dalvikvm(387): GC_CONCURRENT freed 1435K, 42% free 10540K/18055K, paused 2ms+3ms
D/dalvikvm(278): GC_CONCURRENT freed 1839K, 63% free 12684K/33863K, paused 7ms+3ms
D/dalvikvm(190): GC_CONCURRENT freed 1652K, 74% free 14590K/54343K, paused 5ms+10ms
D/dalvikvm(190): GC_CONCURRENT freed 234K, 71% free 16243K/54343K, paused 9ms+19ms
I/dalvikvm-heap(190): Grow heap (frag case) to 29.055MB for 6553616-byte allocation
D/dalvikvm(190): GC_CONCURRENT freed 22K, 55% free 24826K/54343K, paused 9ms+20ms

这是正常情况吗?我能以某种方式解决它吗?

编辑: 我有一个ViewPager。它包含碎片。片段由空的RelativeLayout组成。当应用程序启动时,它会根据动态生成的按钮和edittexts接收JSNO字符串并添加到RelativeLayout。 由于EditText或Button需要上下文,因此使用“getActivity()”返回关联的活动上下文。有时我需要从RelativeLayout中删除所有视图并创建新视图,并且已删除视图已引用Activity它可以不被GC清理,我不确切知道,这是另一个问题(如果有人知道答案,会很好听到)。

因此,从JSON字符串动态生成控件,我们不知道它们的确切数量。这就是我想要做的。

问题是 - 为什么每次点击EditText时GC都会启动。

2 个答案:

答案 0 :(得分:0)

这是android垃圾收集器的正常行为。它将从内存中收集和删除资源,以便在内存中不再需要清除内存以加载更多其他资源。你无法解决它。但是你可以从设置中增加减小堆区域的大小。

在仿真器上增长堆表明在某些时候你有内存泄漏。 大多数设备都可以毫无问题地处理这种泄漏。

堆成长的另一个原因:低效的内存操作。这意味着在某些时候你要求很多记忆(例如你从画廊中选择了5M图像,为它创建了inPuststream并将其作为位图保存在内存中,所以你要求15 + M模拟器只显示高堆增长,但大多数设备都会显示错误)。

如果您看到堆增长 - 分析您的内存使用情况并检测泄漏。

如果你没有发现任何奇怪的东西,你几乎可以安全地忽略堆警告。

答案 1 :(得分:0)

您可以使用eclipse memory analyzer(MAT)来了解真正消耗内存的内容。

MAT教程:

1- Vegella

2- YouTube