我目前正在研究垃圾收集问题,我的Android应用程序,我想知道是否GC_FOR_ALLOC表示比其他GC消息,如GC_CONCURRENT一个更大的问题。
从我的理解,GC_CONCURRENT是做垃圾回收应该做的事情。 堆已经达到了一个特别的限制,最好去清理内存。
GC_FOR_ALLOC,令我有事情发生,如果我试图创建一个对象,并没有记忆中留下这样做更严重。
有没有优先级或“严重”级别的GC消息?
我目前正在研究垃圾收集问题,我的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可以更快地释放内存。 GC的Android上更严重的类型是GC_BEFORE_OOM
,其中,当即使经过了分配请求失败则执行GC_FOR_ALLOC
并且当应用程序堆已成长大,因为它被允许。 当这种情况发生,作为最后的手段,将Dalvik的尝试释放SoftReferences为好,这样在分配内存最后一次尝试之前,如果失败抛出OutOfMemory例外。
如果你好奇地看着这个逻辑的代码,它是在tryMalloc()
在dalvik.git / VM /分配/ Heap.cpp
无论如何,如果你不介意的话,我怀疑看logcat的输出调试你的垃圾收集问题的最有效方式。 我不知道您有什么具体的问题,但你看着工具,如在DDMS的分配跟踪和分析堆用的帮助转储hprof-conv
工具? (见http://android-developers.blogspot.se/2011/03/memory-analysis-for-android.html例如上手。)