Android開發_記憶體溢出_out of memory

來源:互聯網
上載者:User

1. verbosegc 


一般Java虛擬機器要求支援verbosegc選項,輸出詳細的垃圾收集調試資訊。dalvik虛擬機器很安靜的接受verbosegc選項,然後什麼都不做。dalvik虛擬機器使用自己的一套LOG機制來輸出調試資訊。 


如果在Linux下運行adb logcat命令,可以看到如下的輸出: 

D/dalvikvm(  745): GC_CONCURRENT 

freed 199K, 53% free 3023K/6343K,external 0K/0K, paused 2ms+2ms 


其中D/dalvikvm表示由dalvikvm輸出的調試資訊,括弧後的數字代表dalvikvm所在進程的pid。 


GC_CONCURRENT表示觸發垃圾收集的原因,有以下幾種:



  • GC_MALLOC, 記憶體配置失敗時觸發
  • GC_CONCURRENT,當分配的對象大小超過384K時觸發
  • GC_EXPLICIT,對垃圾收集的顯式調用(System.gc)
  • GC_EXTERNAL_ALLOC,外部記憶體配置失敗時觸發


freed 199K表示本次垃圾收集釋放了199K的記憶體, 

53% free 3023K/6343K,其中6343K表示當前記憶體總量,3023K表示可用記憶體,53%表示可用記憶體佔總記憶體的比例。 

external 0K/0K,表示可用外部記憶體/外部記憶體總量 
paused 
2ms+2ms,第一個時間值表示markrootset的時間,第二個時間值表示第二次mark的時間。如果觸發原因不是GC_CONCURRENT,這一行為單個時間值,表示垃圾收集的耗時時間。 

2. 分析 

(1)雖然dalvikvm提供了一些調試資訊,但是還缺乏一些關鍵資訊,比如說mark和sweep的時間, 

分配記憶體失敗時是因為分配多大的記憶體失敗,還有對於SoftReference,WeakReference和PhantomReference的處理,每次垃圾收集處理了多少個這些引用等。 

(2)目前dalvik所有線程共用一個記憶體堆,這樣在分配記憶體時必須線上程之間互斥,可以考慮為每個記憶體配置一個線程局部儲存堆,一些小的記憶體配置可以直接從該堆中分配而無須互斥鎖。 

(3)dalvik虛擬機器中引入了concurrentmark,但是對於多核CPU,可以實現parrelmark,即可以使用多個線程同時運行mark階段。 

這些都是目前dalvik虛擬機器記憶體管理可以做出的改進。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.