freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

art運(yùn)行時(shí)垃圾收集過程分析-資料下載頁

2025-06-29 08:07本頁面
  

【正文】 void MarkSweep::MarkingPhase() { base::TimingLogger::ScopedSplit split(MarkingPhase, amp。timings_)。 Thread* self = Thread::Current()。 BindBitmaps()。 FindDefaultMarkBitmap()。 // Process dirty cards and add dirty cards to mod union tables. heap_ProcessCards(timings_)。 // Need to do this before the checkpoint since we don39。t want any threads to add references to // the live stack during the recursive mark. (SwapStacks)。 heap_SwapStacks()。 WriterMutexLock mu(self, *Locks::heap_bitmap_lock_)。 if (Locks::mutator_lock_IsExclusiveHeld(self)) { // If we exclusively hold the mutator lock, all threads must be suspended. MarkRoots()。 } else { MarkThreadRoots(self)。 // At this point the live stack should no longer have any mutators which push into it. MarkNonThreadRoots()。 } live_stack_freeze_size_ = heap_GetLiveStack()Size()。 MarkConcurrentRoots()。 heap_UpdateAndMarkModUnion(this, timings_, GetGcType())。 MarkReachableObjects()。 } 這個(gè)函數(shù)定義在文件art/runtime/gc/collector/。 MarkSweep類的成員函數(shù)MarkingPhase標(biāo)記對象的過程如下所示: A. 調(diào)用成員函數(shù)BindBitmap設(shè)置回收范圍。 B. 調(diào)用成員函數(shù)FindDefaultMarkBitmap找到回收策略為kGcRetentionPolicyAlwaysCollect的Space對應(yīng)的Mark Bitmap,并且保存在成員變量current_mark_bitmap_中。這個(gè)函數(shù)我們在前面已經(jīng)分析過了。 C. 調(diào)用Heap類的成員函數(shù)ProcessCards處理Card Table中的Dirty Card,以及這些Dirty Card添加到對應(yīng)的Mod Union Table中去。 D. 調(diào)用Heap類的成員函數(shù)SwapStacks交換ART運(yùn)行時(shí)的Allocation Stack和Live Stack。 E. 對于非并行GC,當(dāng)前線程在掛起其它ART運(yùn)行時(shí)線程的過程中,已經(jīng)獲得Locks類的靜態(tài)成員變量mutator_lock_描述的讀寫鎖的寫訪問,因此這時(shí)候就調(diào)用成員函數(shù)MarkRoots來標(biāo)記那些不可以在沒有獲得Locks類的靜態(tài)成員變量mutator_lock_描述的讀寫鎖的情況下訪問的根集對象。注意,MarkSweep類的成員函數(shù)MarkRoots只通過當(dāng)前線程來標(biāo)記根集對象。 F. 對于并行GC,由于標(biāo)記階段并沒有掛起其它的ART運(yùn)行時(shí)線程,因此這時(shí)候就調(diào)用成員函數(shù)MarkThreadRoots來并發(fā)標(biāo)記那些不可以在沒有獲得Locks類的靜態(tài)成員變量mutator_lock_描述的讀寫鎖的情況下訪問的位于線程調(diào)用棧中的根集對象,接著再在當(dāng)前線程中調(diào)用成員函數(shù)MarkNonThreadRoots標(biāo)記那些不可以在沒有獲得Locks類的靜態(tài)成員變量mutator_lock_描述的讀寫鎖的情況下訪問的其它根集對象。 G. 獲得Live Stack的大小,保存成員變量live_stack_freeze_size_中。注意,這時(shí)候Live Stack的大小即為交換Allocation Stack和Live Stack之前Allocation Stack的大小,即從上次GC以來新分配的對象的個(gè)數(shù)。 H. 調(diào)用成員函數(shù)MarkConcurrentRoots標(biāo)記那些可以在沒有獲得Locks類的靜態(tài)成員變量mutator_lock_描述的讀寫鎖的情況下訪問的根集對象。 I. 調(diào)用Heap類的成員函數(shù)UpdateAndMarkModUnion處理Mod Union Table中的Dirty Card。 J. 調(diào)用成員函數(shù)MarkReachableObjects遞歸標(biāo)記那些可以從根集對象到達(dá)的其它對象。 上述就是GC的標(biāo)記階段,它是一個(gè)很復(fù)雜的過程,涉及到的關(guān)鍵函數(shù)有MarkSweep類的成員函數(shù)BindBitmap、MarkRoots、MarkThreadRoots、MarkNonThreadRoots、MarkConcurrentRoots和MarkReachableObjects,以及Heap類的成員函數(shù)ProcessCards、SwapStacks和UpdateAndMarkModUnion。接下來我們就詳細(xì)分析這些函數(shù)的實(shí)現(xiàn),以及這些函數(shù)涉及到的概念。 在前面一文中,我們提到,Mark Sweep、Partial Mark Sweep和Sticky Mark Sweep的回收范圍是不同的,它們分別通過實(shí)現(xiàn)的自己的成員函數(shù)BindBitmap來限定回收范圍,因此,接下來我們就分別分析MarkSweep、PartialMarkSweep和StickyMarkSweep三個(gè)類的成員函數(shù)BindBitmap的實(shí)現(xiàn)。 MarkSweep類的成員函數(shù)BindBitmap的實(shí)現(xiàn)如下所示:[cpp] view plain copy 在CODE上查看代碼片派生到我的代碼片void MarkSweep::BindBitmaps() { (BindBitmaps)。 WriterMutexLock mu(Thread::Current(), *Locks::heap_bitmap_lock_)。 // Mark all of the spaces we never collect as immune. for (const autoamp。 space : GetHeap()GetContinuousSpaces()) { if (spaceGetGcRetentionPolicy() == space::kGcRetentionPolicyNeverCollect) { ImmuneSpace(space)。 } } ()。 } 這個(gè)函數(shù)定義在文件art/runtime/gc/collector/。 MarkSweep類的成員函數(shù)BindBitmap調(diào)用另外一個(gè)成員函數(shù)ImmuneSpace將回收策略為kGcRetentionPolicyNeverCollect的Space的Live Bitmap和Mark Bitmap進(jìn)行交換,這樣做的效果就相當(dāng)于不對該Space進(jìn)行GC。從前面一文可以知道,回收策略為kGcRetentionPolicyNeverCollect的Space就是Image Space,因此,MarkSweep類就只對Zygote Space和Allocation Space進(jìn)行GC。 MarkSweep類的成員函數(shù)ImmuneSpace的實(shí)現(xiàn)如下所示:[cpp] view plain copy 在CODE上查看代碼片派生到我的代碼片void MarkSweep::ImmuneSpace(space::ContinuousSpace* space) { // Bind live to mark bitmap if necessary. if (spaceGetLiveBitmap() != spaceGetMarkBitmap()) { BindLiveToMarkBitmap(space)。 } // Add the space to the immune region. if (immune_begin_ == NULL) { DCHECK(immune_end_ == NULL)。 SetImmuneRange(reinterpret_castObject*(spaceBegin()), reinterpret_castObject*(spaceEnd()))。 } else { const space::ContinuousSpace* prev_space = nullptr。 // Find out if the previous space is immune. for (space::ContinuousSpace* cur_space : GetHeap()GetContinuousSpaces()) { if (cur_space == space) { break。 } prev_space = cur_space。 } // If previous space was immune, then extend the immune region. Relies on continuous spaces // being sorted by Heap::AddContinuousSpace. if (prev_space != NULL amp。amp。 immune_begin_ = reinterpret_castObject*(prev_spaceBegin()) amp。amp。 immune_end_ = reinterpret_castObject*(prev_spaceEnd())) { immune_begin_ = std::min(reinterpret_castObject*(spaceBegin()), immune_begin_)。 immune_end_ = std::max(reinterpret_castObject*(spaceEnd()), immune_end_)。 } } } 這個(gè)函數(shù)定義在文件art/runtime/gc/collector/。 MarkSweep類的成員函數(shù)ImmuneSpace首先是判斷參數(shù)space描述的Space的Live Bitmap和Mark Bitmap是否是同一個(gè)Bitmap。如果是的話,那么就不需要調(diào)用成員函數(shù)BindLiveToMarkBitmap對它們進(jìn)行交換了。一般來說,一個(gè)Space的Live Bitmap和Mark Bitmap指向的是不同的Bitmap的,但是Image Space比較特殊,它們指向的是同一個(gè)Bitmap。這一點(diǎn)在前面一文中有提到。 如果之前有Space也被設(shè)置為不進(jìn)行回收,那么除了調(diào)用成員函數(shù)BindLiveToMarkBitmap交換參數(shù)space描述的Space的Live Bitmap和Mark Bitmap之外,MarkSweep類的成員函數(shù)ImmuneSpace還會參數(shù)space描述的Space占用的內(nèi)存區(qū)域與之前也被設(shè)置為不進(jìn)行回收的Space占用的內(nèi)存區(qū)域進(jìn)行合并,最后將得到的不會被回收的內(nèi)存總區(qū)域的開始位置和結(jié)束位置記錄在MarkSweep類的成員變量immune_begin_ 和immune_end_中。 另一方面,如果之前沒有Space也被設(shè)置過不進(jìn)行回收,那么MarkSweep類的成員函數(shù)ImmuneSpace就會將參數(shù)space描述的Space占用的內(nèi)存區(qū)域的開始位置和結(jié)束位置記錄在MarkSweep類的成員變量immune_begin_ 和immune_end_中,以便 后面可以調(diào)用MarkSweep類的成員函數(shù)IsImmune判斷一個(gè)對象是否位于非回收Space中。 MarkSweep類的成員函數(shù)IsImmune的實(shí)現(xiàn)如下所示:[cpp] view plain copy 在CODE上查看代碼片派生到我的代碼片class MarkSweep : public GarbageCollector { public: ...... protected: ...... // Returns true if an object is inside of the immune reg
點(diǎn)擊復(fù)制文檔內(nèi)容
外語相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1