Android中的垃圾收集器正在运行,但ddms';分配跟踪器

Android中的垃圾收集器正在运行,但ddms';分配跟踪器,android,enums,garbage-collection,ddms,Android,Enums,Garbage Collection,Ddms,在我的应用程序中,我注意不要在主渲染循环中进行堆分配,以防止垃圾收集器不得不执行它的任务 在对我的应用程序进行了一系列更改之后,我突然发现垃圾收集器每隔一两秒就会被调用一次,每次调用大约释放400k内存 我回顾了我所做的更改,在渲染线程上没有任何显式分配。因此,我运行ddms并使用“分配跟踪程序”工具,但除了与运行ddms相关的正常分配之外,没有发生任何分配。当然,对于每秒大约被垃圾收集一次的40万字节来说,显示的分配显然不够(我已经找到了解决方案,但是为了其他人的利益,我发布了问题+答案) 事

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

在对我的应用程序进行了一系列更改之后,我突然发现垃圾收集器每隔一两秒就会被调用一次,每次调用大约释放400k内存

我回顾了我所做的更改,在渲染线程上没有任何显式分配。因此,我运行ddms并使用“分配跟踪程序”工具,但除了与运行ddms相关的正常分配之外,没有发生任何分配。当然,对于每秒大约被垃圾收集一次的40万字节来说,显示的分配显然不够(我已经找到了解决方案,但是为了其他人的利益,我发布了问题+答案)

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

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

编辑: 经过一些额外的测试,克隆阵列通常不会出现在分配跟踪器中

其他信息:
克隆对象时,这似乎是Honeycom及以下版本中的一个问题。它将在ICS中固定。()

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

如果可能,应避免使用枚举。。。大多数情况下,可以创建静态int字段,我更喜欢使用标准类来实现更高级的功能。Enum在Java中似乎非常昂贵—实际上并没有那么糟糕,这取决于您如何使用它们。如果您发现它们在您的应用程序中导致了特定的性能问题,请尽一切可能优化内容并使用静态int。但是在大多数情况下,当使用enum.Agree时,可能不会有任何显著/明显的性能影响,但是使用公共静态final int SOMETHING=1;肯定比使用公共枚举值{SOMETHING}要好;如果我没有弄错的话,Enum添加到语言中的时间相当晚,而且应该太贵了overall@JesusFreke:当您说“克隆阵列通常不会出现在分配跟踪器中”时,使用的是什么特定代码?这听起来像是一个工具错误,所以我希望复制你的结果。@JesusFreke:你说的“克隆数组”到底是什么意思<代码>系统.arraycopy()?循环的
Arrays.copyOf()
?还有别的吗?是的,听起来和我看到的很像。在我的例子中,这是由于在调用.values()时发生了阵列克隆。我必须在我的蜂巢平板电脑上尝试我的测试用例,看看问题是否得到了解决。不,克隆阵列仍然不会出现在蜂巢(3.0)上的分配跟踪器中