是GC_FOR_ALLOC更“严重”的调查内存使用情况是什么时候?(Is GC_FOR_ALLOC

2019-06-25 22:10发布

我目前正在研究垃圾收集问题,我的Android应用程序,我想知道是否GC_FOR_ALLOC表示比其他GC消息,如GC_CONCURRENT一个更大的问题。

从我的理解,GC_CONCURRENT是做垃圾回收应该做的事情。 堆已经达到了一个特别的限制,最好去清理内存。

GC_FOR_ALLOC,令我有事情发生,如果我试图创建一个对象,并没有记忆中留下这样做更严重。

有没有优先级或“严重”级别的GC消息?

Answer 1:

从某种意义上说, GC_FOR_ALLOC比更严重GC_CONCURRENT ,因为GC_FOR_ALLOC意味着没有足够的可用内存来满足分配请求,所以垃圾收集是必要的,而GC_CONCURRENT只是表示GC感觉就像跑步,通常是因为游离量内存比的分配之后的某个阈值变低。

一个GC_FOR_ALLOC本身是不是然而,在您的应用程序出现问题的迹象:

  • Android应用程序启动与增长(在一定程度上),当应用程序需要更多内存的小堆,并且GC_FOR_ALLOC增加堆的大小之前完成。 在这种情况下GC_FOR_ALLOC是完全正常的。
  • 如果您分配内存的速度比并发GC有时间来释放它, 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例如上手。)



文章来源: Is GC_FOR_ALLOC more “serious” when investigating memory usage?