1

我有一些 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 组成。当应用程序启动时,它会根据动态生成并添加到 RelativeLayout 的按钮和编辑文本来接收 JSNO 字符串。由于 EditText 或 Button 需要一个上下文,它使用“getActivity()”返回相关的活动上下文。有时我需要从 RelativeLayout 中删除所有视图并创建新视图,因为删除的视图引用了 Activity,GC 无法清理它,我不知道确切,这是另一个问题(如果有人知道答案,会很好听到)。

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

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

4

2 回答 2

0

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

MAT教程:

1-维盖拉

2 -YouTube

于 2014-02-25T08:15:35.363 回答
0

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

模拟器上堆的增长表明在某些时候你有内存泄漏。大多数设备可以毫无问题地处理此类泄漏。

堆长大的另一个原因:低效的内存操作。这意味着有时您需要大量内存(例如,您从图库中选择了 5M 图像,为其创建了 inpuststream 并将其作为位图保存在内存中,因此您要求 15+M 仿真器将显示只有高堆增长,但大多数设备会显示错误)。

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

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

于 2013-08-12T07:00:51.090 回答