Dalvik内存管理
Dalvik內存:
1.系統堆/外部堆(External heap)/CRT堆(Java方法調用棧/Java函數調用棧/...)----malloc/calloc/realloc/free
??? OS系統啟動本地程序->創建CRT(包括堆)->入口函數
2.系統棧(Dalvik函數調用棧)
??? 系統創建:SP指針
3.GC堆(系統申請內存,dl組織成GC堆)----dvmMalloc/垃圾回收----Dalvik啟動創建/關閉釋放
??? 啟動:創建一個GC堆(GCHeap),其包含3個堆,常用第一個堆
??? (1)dvmAllocRegion():向系統申請一塊映射過的內存,交給dl管理
??? (2)createMspace:交給dl管理---只用系統分配的一半以便擴充
??? (3)mspace_malloc:在dl內存(空間)上創建一個GC堆(包括GC堆的管理數據)
4.方法區/線性內存(Linear)(ClassObject的實體數據)----dvmLinearAlloc/dvmLinearFree----Dalvik啟動創建/關閉釋放
??? 向系統申請一塊映射過的內存,直接組織成Linear內存......只讀且線性
--------------------------------------------------------------------------------
GC堆位圖:每一位對應堆中8字節內存
?(1)活對象位圖(liveBits)
?(2)標記位圖(markBits)
--------------------------------------------------------------------------------
創建對象(dvmHeapSourceAlloc):(標志位flags:ALLOC_DEFAULT,ALLOC_DONT_TRACK,ALLOC_FINALIZABLE)
?(1)dlmalloc在GC堆上:分配內存,設置liveBits
?(2)處理flags標志位(ALLOC_DEFAULT:放入track引用表,ALLOC_DONT_TRACK:無,ALLOC_FINALIZABLE:放入finalizable引用表)
?(3)(若有引用)賦值給引用
--------------------------------------------------------------------------------
垃圾回收(dvmCollectGarbageInternal):Mark-Sweep
????? (1)標記(Mark):掃描引用表和調用棧,設置markBits
? ? ? ? ? ? ?(1)標記根集(RootSet):需要遞歸掃描的放入標記棧(MarkStack)
? ? ? ? ? ? ? ? ? ? ?System classes defined by root classloader
? ? ? ? ? ? ? ? ? ? ?For each thread:
? ? ? ? ? ? ? ? ? ? ? ? ? ? Interpreted stack, from top to "curFrame"
? ? ? ? ? ? ? ? ? ? ? ? ? ? Dalvik registers (args + local vars)
? ? ? ? ? ? ? ? ? ? ? ? ? ? JNI local references
? ? ? ? ? ? ? ? ? ? ? ? ? ? Automatic VM local references (TrackedAlloc):跟蹤放入的引用(如果想跟蹤某個Java對象可以調dvmAddTrackedAlloc,放入跟蹤引用表)
? ? ? ? ? ? ? ? ? ? ? ? ? ? Associated Thread/VMThread object
? ? ? ? ? ? ? ? ? ? ? ? ? ? ThreadGroups (could track & start with these instead of working
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? upward from Threads)
? ? ? ? ? ? ? ? ? ? ? ? ? ? Exception currently being thrown, if present
? ? ? ? ? ? ? ? ? ? ?JNI global references
? ? ? ? ? ? ? ? ? ? ?Interned string table
? ? ? ? ? ? ? ? ? ? ?Primitive classes
? ? ? ? ? ? ? ? ? ? ?Special objects
? ? ? ? ? ? ? ? ? ? ? ? ? ? gDvm.outOfMemoryObj
? ? ? ? ? ? ? ? ? ? ?Objects allocated with ALLOC_NO_GC
? ? ? ? ? ? ? ? ? ? ?Objects pending finalization (but not yet finalized):待finalize引用表
? ? ? ? ? ? ? ? ? ? ?Objects in debugger object registry
? ? ? ? ? ? ?(2)遞歸掃描標記棧(MarkStack)
? ? ? (2)處理Finalize表
????? (3)清除(Sweep):比較liveBits和markBits,清除沒有標記的對象(dvmHeapSourceFreeList:清除位圖,釋放內存)
?
--------------------------------------------------------------------------------
Dalvik不支持SoftReference/WeakReference/PhantomReference,全部當成強引用,GC時先清空這3個引用表(但如果不清空還是有相應的管理函數存在),但Java層面并不知道
SoftReference/WeakReference/PhantomReference都繼承自Reference類(強引用)
--------------------------------------------------------------------------------
但同時Dalvik保留了SoftReference/WeakReference/PhantomReference的支持代碼
1.Mark標記時不會掃描(全局)軟/弱/虛引用表
2.如果注釋掉這3行代碼,打開軟/弱/虛引用支持
? ? ? ? ?gcHeap->softReferences = NULL;
? ? ? ? ?gcHeap->weakReferences = NULL;
? ? ? ? ?gcHeap->phantomReferences = NULL;
? ? 則在Sweep之前:
? ? (1)SoftRefs:如果內存不足,軟引用表中引用清空(NULL),否則補充標記軟引用表所有引用----或者刪除
? ? (2)WeakRefs:弱引用表中引用清空(NULL)-----直接刪除
? ? (3)PhantomRefs:虛引用表中引用清空(NULL)----直接刪除
--------------------------------------------------------------------------------
finalizable引用表:對象如果有finalize方法,創建時會被放入(全局)finalize引用表,掃描根集后(Sweep前),finalize表中未標記對象放入pendingFinalize待finalize表,留給HeapWorker線程處理
Dalvik創建一個HeapWorker線程,每隔一段時間處理 待finalize表(從待fianlize表依次取出并臨時放入線程局部引用表,調用finalize方法,取出線程局部引用表----下次不會被掃描到----被GC)
?
--------------------------------------------------------------------------------
android dalvik vm alloc
總結
以上是生活随笔為你收集整理的Dalvik内存管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 内存管理内幕
- 下一篇: GC垃圾回收的三色标记算法