Android中的垃圾收集器正在运行,但在ddms的分配跟踪器中没有显示任何内容

时间:2011-09-04 00:58:28

标签: android enums garbage-collection ddms

在我的应用程序中,我注意不要在主渲染循环中进行堆分配,以防止垃圾收集器不得不做它的事情。

在对我的应用程序进行一系列更改后,我突然看到垃圾收集器每隔一两秒被调用一次,并且每次调用时释放大约400k内存。

我回顾一下我所做的更改,并且我没有在渲染线程上发生任何明确的分配。所以我运行ddms并使用“Allocation Tracker”工具,但没有发生任何分配,除了与运行ddms相关的正常分配。当然,没有为400k字节显示足够的分配,显然每秒钟都会被垃圾收集

2 个答案:

答案 0 :(得分:7)

(我已经找到了解决方案,但我发布的问题+答案是为了其他人的利益)

事实证明,我能够跟踪问题,调用枚举类的.values()方法,该方法在每次调用时都会分配一个新数组。但由于某种原因,这些分配没有出现在ddms的分配跟踪器中,因此很难跟踪。

幸运的是,我能够使用git bisect查找引入该问题的具体更改,然后将其跟踪到该更改中的确切问题。

编辑: 经过一些额外的测试后,似乎克隆数组通常不会出现在分配跟踪器中。

其他信息: 在克隆对象时,这似乎是Honeycomb及以下的问题。它将在ICS中修复。 (http://code.google.com/p/android/issues/detail?id=19831

答案 1 :(得分:0)

请提供有关垃圾收集器类型的信息。 位图分配,意味着实际位图像素(非位图信息非常小)被分配到堆中, BUT 对于低于3.0的Android版本(Honeycomp)的任何分配跟踪器工具都不可见。因此,如果要加载位图信息,将调用GC extrernal分配。