我目前正在调查我的Android应用程序的垃圾回收问题,并且很好奇是否知道GC_FOR_ALLOC表示比其他GC消息(例如GC_CONCURRENT)更大的问题。
据我了解,GC_CONCURRENT正在执行垃圾回收器应做的事情。堆已达到特定限制,最好去清理内存。
GC_FOR_ALLOC向我建议,如果我尝试创建一个对象并且没有剩余的存储空间,则可能会发生一些更严重的事情。
GC消息是否具有优先级或“严重性”级别?
最佳答案
从某种意义上说,GC_FOR_ALLOC
比GC_CONCURRENT
更为严重,因为GC_FOR_ALLOC
意味着没有足够的可用内存来满足分配请求,因此必须进行垃圾回收,而GC_CONCURRENT
只是意味着GC感觉像在运行,通常是因为空闲量分配后内存低于特定阈值。
但是,GC_FOR_ALLOC
本身并不表示您的应用程序有问题:
GC_FOR_ALLOC
。在这种情况下,GC_FOR_ALLOC
是完全正常的。 GC_FOR_ALLOC
是不可避免的。而且,分配内存的速度没有比并发GC释放内存的速度固有的错误。 在Android上,更严重的GC类型是
GC_BEFORE_OOM
,即使在GC_FOR_ALLOC
之后分配请求失败,并且应用程序堆已达到允许的最大大小时,也会执行该类型的GC。当发生这种情况时,作为最后的选择,Dalvik将在尝试最后一次分配内存之前也尝试释放SoftReferences,如果失败,则抛出OutOfMemory异常。如果您想看看此逻辑的代码,请在dalvik.git/vm/alloc/Heap.cpp中的
tryMalloc()
中查看无论如何,如果您不介意的话,我怀疑查看logcat输出是调试垃圾回收问题的最有效方法。我不知道您遇到什么具体问题,但是您是否研究过DDMS中的“分配跟踪器”之类的工具,并借助
hprof-conv
工具来分析堆转储? (例如,请参阅http://android-developers.blogspot.se/2011/03/memory-analysis-for-android.html以开始使用。)