5.0以前虚拟器GC回收垃圾
2016-11-16 10:12:32 0 举报
AI智能生成
在5.0版本之前,Android系统使用的是基于标记-清除算法的垃圾回收器。该算法分为两个阶段:标记和清除。首先,垃圾回收器会遍历所有的对象,标记出那些不再使用的对象。然后,它会清除所有被标记的对象,释放它们占用的内存空间。这种方式虽然简单高效,但也存在一些问题。例如,它可能会导致应用程序暂停或卡顿,因为它需要停止应用程序的执行来执行垃圾回收操作。此外,由于标记-清除算法无法处理浮动垃圾(即已经删除但仍被其他对象引用的对象),所以它可能会导致内存泄漏问题。为了解决这些问题,Android 5.0引入了新的垃圾回收器,采用了更先进的算法和技术来提高垃圾回收的效率和准确性。
作者其他创作
大纲/内容
GcSpec结构体
bool isPartial
bool isConcurrent
bool doPreserve
const char *reason
分配内存成功的函数调用情况
void* dvmHeapSourceAlloc(size_t n)
手动GC或者收到系统GC信号
void dvmCollectGarbage()
涉及到的重要函数讲解
void dvmSuspendAllThreads(SuspendCause why)
bool dvmHeapBeginMarkStep(bool isPartial)
static bool createMarkStack(GcMarkStack *stack)
void *dvmHeapSourceGetImmuneLimit(bool isPartial)
void dvmHeapMarkRootSet()
void dvmMarkImmuneObjects(const char *immuneLimit)
void dvmVisitRoots(RootVisitor *visitor, void *arg)
visitHashTable(visitor, gDvm.loadedClasses, ROOT_STICKY_CLASS, arg);
visitPrimitiveTypes(visitor, arg);
visitHashTable(visitor, gDvm.dbgRegistry, ROOT_DEBUGGER, arg);
visitHashTable(visitor, gDvm.literalStrings, ROOT_INTERNED_STRING, arg);
visitIndirectRefTable(visitor, &gDvm.jniGlobalRefTable, 0, ROOT_JNI_GLOBAL, arg);
visitReferenceTable(visitor, &gDvm.jniPinRefTable, 0, ROOT_VM_INTERNAL, arg);
visitThreads(visitor, arg);
static void visitThread(RootVisitor *visitor, Thread *thread, void *arg)
(*visitor)(&thread->threadObj, threadId, ROOT_THREAD_OBJECT, arg);
(*visitor)(&thread->exception, threadId, ROOT_NATIVE_STACK, arg);
visitReferenceTable(visitor, &thread->internalLocalRefTable, threadId, ROOT_NATIVE_STACK, arg);
visitIndirectRefTable(visitor, &thread->jniLocalRefTable, threadId, ROOT_JNI_LOCAL, arg);
visitReferenceTable(visitor, &thread->jniMonitorRefTable, threadId, ROOT_JNI_MONITOR, arg);
visitThreadStack(visitor, thread, arg);
static void rootMarkObjectVisitor(void *addr, u4 thread, RootType type, void *arg)
static void markObjectNonNull(const Object *obj, GcMarkContext *ctx, bool checkFinger)
static long setAndReturnMarkBit(GcMarkContext *ctx, const void *obj)
static void markStackPush(GcMarkStack *stack, const Object *obj)
(*visitor)(&gDvm.outOfMemoryObj, 0, ROOT_VM_INTERNAL, arg);
(*visitor)(&gDvm.internalErrorObj, 0, ROOT_VM_INTERNAL, arg);
(*visitor)(&gDvm.noClassDefFoundErrorObj, 0, ROOT_VM_INTERNAL, arg);
void dvmClearCardTable()
void dvmResumeAllThreads(SuspendCause why)
void dvmHeapScanMarkedObjects(void)
void dvmHeapBitmapScanWalk(HeapBitmap *bitmap, BitmapScanCallback *callback, void *arg)
static void scanBitmapCallback(Object *obj, void *finger, void *arg)
static void scanObject(const Object *obj, GcMarkContext *ctx)
scanClassObject(obj, ctx);
scanArrayObject(obj, ctx);
scanDataObject(obj, ctx);
static void markObject(const Object *obj, GcMarkContext *ctx)
markObjectNonNull(obj, ctx, true);
scanFields(obj, ctx);
static void delayReferenceReferent(Object *obj, GcMarkContext *ctx)
static void processMarkStack(GcMarkContext *ctx)
void dvmHeapReMarkRootSet()
dvmVisitRoots(rootReMarkObjectVisitor, ctx);
- static void rootReMarkObjectVisitor(void *addr, u4 thread, RootType type, void *arg)
void dvmHeapReScanMarkedObjects()
static void scanGrayObjects(GcMarkContext *ctx)
- const u1 *scanDirtyCards(const u1 *start, const u1 *end, GcMarkContext *ctx)
static Object *nextGrayObject(const u1 *base, const u1 *limit,const HeapBitmap *markBits)
void dvmHeapProcessReferences(Object **softReferences, bool clearSoftRefs, Object **weakReferences,Object **finalizerReferences,Object **phantomReferences)
static void preserveSomeSoftReferences(Object **list)
static void clearWhiteReferences(Object **list)
static void enqueueFinalizerReferences(Object **list)
void dvmHeapSweepSystemWeaks()
void dvmHeapSourceSwapBitmaps()
void dvmHeapSweepUnmarkedObjects(bool isPartial, bool isConcurrent,size_t *numObjects, size_t *numBytes)
- void dvmHeapBitmapSweepWalk(const HeapBitmap *liveHb, const HeapBitmap *markHb,uintptr_t base, uintptr_t max, BitmapSweepCallback *callback, void *callbackArg)
static void sweepBitmapCallback(size_t numPtrs, void **ptrs, void *arg)
size_t dvmHeapSourceFreeList(size_t numPtrs, void **ptrs)
void dvmHeapFinishMarkStep()
GC类型
GC_FOR_MALLOC
GC_CONCURRENT
GC_EXPLICIT
GC_BEFORE_OOM
分配内存失败的函数调用情况
void gcForMalloc(bool clearSoftReferences)
GC线程的启动
static void *gcDaemonThread(void* arg)
Mark-Sweep算法流程图

收藏
0 条评论
下一页