天天看點

記憶體調試 D/dalvikvm( 809 ): GC_CONCURRENT freed

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

 GC_EXTERNAL_ALLOC freed 297K, 49% free 3411K/6663K, external 24870K/26260K, paused 83ms

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

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

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

前面Free的記憶體是VM中java使用的記憶體,external是指VM中通過JNI中Native的類中的malloc配置設定出的記憶體例如Bitmap和一些Cursor都是這麼配置設定的。

在Davilk中,給一個程式配置設定的記憶體根據機型廠商的不同,而不同,現在的大部分的是32M了,而在VM内部會把這些記憶體分成java使用的記憶體和 Native使用的記憶體,它們之間是不能共享的,就是說當你的Native記憶體用完了,現在Java又有空閑的記憶體,這時Native會重新像VM申請,而不是直接使用java的。