日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Dalvik内存管理

發布時間:2024/4/15 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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内存管理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。