網上非常多檔案介紹了 jvm 記憶體管理的理論,但在 Dalvikvm 中,到底是怎樣實作的。
這幾天猛看了 Dalvikvm 的源碼,說一下我的了解:
在大層面上講跟理論一樣,jvm 把記憶體分成了一些區,

關于各區的說明參見。
對于hello world 這樣簡單程式,發現dalvikvm也就用了一個heap, 就是Eden區了。
dalvikvm 使用 mmap 建立共享記憶體(堆是多個線程共享的),就是Eden區,再用dlmalloc 中的( mspace_free,mspace_calloc等) 來自己對它進行管理(也就不在調用OS的記憶體分派了,這樣做可能是由于性能能夠預測)
代碼在:dalvik/vm/alloc/HeapSource.cpp#dvmHeapSourceStartup
值得注意的是,除了使用dlmalloc,dalvikvm 還是用了2個bitmap的來相應整個堆,一個叫liveBitmap, 一個叫markBitmap 是為了做gc的。
1在gc過程中,先把markbitmap清0
2在sweepscan過程中,找到每一object指針,就在相應markbitmap位置置位,這是一個深度優先(使用了stack)搜尋算法
3在liveBitmap中有但markbitmap沒有标記的對象就是該在sweep時用mspace_free 來釋放
4markbitmap成了了liveBitmap 表明live objects
進入下一次循環
因為對象有大有小,而bitmap 是依照object的最小的size來映射一個bit的, 是以肯定有浪費的空間, 但為了現實marksweep 的高效,這點浪費還是值得的。
建立對象
( 注意:一般 new建立對象多用彙編實作,但也調用到dvmAllocObject)
垃圾回收順序圖