Dalvik内存管理

Dalvik内存管理_第1张图片

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

你可能感兴趣的:(exception,ClassLoader,jni,null,reference,Primitive)