【轉載】理解Android中垃圾回收日誌信息

本文轉自:http://droidyue.com/blog/2014/11/08/understanding-garbage-collection-output-messages-in-android/android

感謝做者的翻譯!!!google

 

若是你是一名Android開發者而且經常看程序日誌的話,那麼下面的這些信息對你來講可能一點都不陌生。spa

GC_CONCURRENT freed 178K, 41% free 3673K/6151K, external 0K/0K, paused 2ms+2ms
GC_EXPLICIT freed 6K, 41% free 3667K/6151K, external 0K/0K, paused 29ms
GC_CONCURRENT freed 379K, 42% free 3856K/6535K, external 0K/0K, paused 2ms+3ms
GC_EXPLICIT freed 144K, 41% free 3898K/6535K, external 0K/0K, paused 32ms
GC_CONCURRENT freed 334K, 40% free 4091K/6727K, external 0K/0K, paused 2ms+3ms

 

可是這些究竟是什麼,又有什麼含義呢?線程

上面的這幾行就是Android系統垃圾回收的部分輸出信息。每當垃圾回收被觸發的時候,你就能夠經過logcat查看到這樣的信息。這樣短短的一行的日誌有着很大的信息量。好比經過日誌咱們能夠發現程序可能有內存(泄露)問題。本文將具體介紹這些日誌信息的每一部分的含義來幫助幫助你們更好地瞭解垃圾回收的運行狀況。翻譯

緣由

GC_CONCURRENT freed 178K, 41% free 3673K/6151K, external 0K/0K, paused 2ms+2ms 
GC_EXPLICIT freed 6K, 41% free 3667K/6151K, external 0K/0K, paused 29ms日誌

紅顏色標出的部分就是垃圾回收觸發的緣由。在Android中有五種類型的垃圾回收觸發緣由。code

  • GC_CONCURRENT 當堆內存增加到必定程度時會觸發。此時觸發能夠對堆中的沒有用的對象及時進行回收,騰出空間供新的對象申請,避免進行沒必要要的增大堆內存的操做。
  • GC_EXPLICIT 當程序中調用System.gc()方法觸發。這個方法應避免出如今程序中調用。由於JVM有足夠的能力來控制垃圾回收。
  • GC_EXTERNAL_MALLOC 當Bitmap和NIO Direct ByteBuffer對象分配外部存儲(機器內存,非Dalvik堆內存)觸發。這個日誌只有在2.3以前存在,從2.3系統開始,垃圾回收進行了調整,前面的對象都會存儲到Dalivik堆內存中。因此在2.3系統以後,你就不再會看到這種信息了。
  • GC_FOR_MALLOC 當堆內存已滿,系統須要更多內存的時候觸發。這條日誌出現後意味着JVM要暫停你的程序進行垃圾回收操做。
  • GC_HPROF_DUMP_HEAP 當建立一個內存分析文件HPROF時觸發。

結果

GC_CONCURRENT freed 178K, 41% free 3673K/6151K, external 0K/0K, paused 2ms+2ms 
GC_EXPLICIT freed 6K, 41% free 3667K/6151K, external 0K/0K, paused 29ms對象

這部分數據告訴咱們JVM進行垃圾回收釋放了多少空間。blog

堆內存數據

GC_CONCURRENT freed 178K, 41% free 3673K/6151K, external 0K/0K, paused 2ms+2ms 
GC_EXPLICIT freed 6K, 41% free 3667K/6151K, external 0K/0K, paused 29ms內存

這部分告訴咱們堆內存中可用內存佔的比例,當前活躍的對象總的空間,以及當前堆的總大小。因此這裏的數據就是41%的堆內存可用,已經使用了3673K,總的堆內存大小爲6151K。

外部存儲數據

GC_EXTERNAL_ALLOC freed 1125K, 47% free 6310K/11847K, external 1051K/1103K, paused 46ms
GC_EXTERNAL_ALLOC freed 295K, 47% free 6335K/11847K, external 1613K/1651K, paused 41ms

這部分數據告訴咱們外部存儲(位於機器內存)對象的數據。在2.3以前,bitmap對象存放在機器內存。所以在第一條數據中咱們能夠看到以有1051K使用,外部存儲爲1103K。

上面兩行數據相差100毫秒,咱們能夠看到第一條數據代表外部存儲快滿了,因爲GC_EXTERNAL_ALLOC被觸發,外部存儲空間擴大到了1651K。

垃圾回收暫停時間

GC_CONCURRENT freed 178K, 41% free 3673K/6151K, external 0K/0K,paused 2ms+2ms 
GC_EXPLICIT freed 6K, 41% free 3667K/6151K, external 0K/0K, paused 29ms

這部分數據代表垃圾回收消耗的時間。在GC_CONCURRENT回收時,你會發現兩個暫停時間。一個是在回收開始的暫停時間,另外一個時在回收結束的暫停時間。GC_CONCURRENT從2.3開始引入,相比以前的程序所有暫停的垃圾回收機制,它的暫停時間要小的多。通常少於5毫秒。由於GC_CONCURRENT的絕大多數操做在一個單獨的線程中進行。

本文中內容摘自 Google I/O 2011: Memory management for Android Apps,若是感興趣,請訪問這裏瞭解更多。

原文地址

https://sites.google.com/site/pyximanew/blog/androidunderstandingddmslogcatmemoryoutputmessages

相關文章
相關標籤/搜索