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