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

正文內(nèi)容

art運(yùn)行時(shí)垃圾收集過(guò)程分析-閱讀頁(yè)

2025-07-14 08:07本頁(yè)面
  

【正文】 kSuspendRequest) != 0)) { // Wait while our suspend count is nonzero. MutexLock mu(this, *Locks::thread_suspend_count_lock_)。 ...... while (( amp。 old_state_and_flags = state_and_flags_。 // Atomically change from suspended to runnable if no suspend request pending. old_state_and_flags = state_and_flags_。 kSuspendRequest) == 0)) { union StateAndFlags new_state_and_flags = old_state_and_flags。 // CAS the value without a memory barrier, that occurred in the lock above. done = android_atomic_cas(, , amp。 } if (UNLIKELY(!done)) { // Failed to transition to Runnable. Release shared mutator_lock_ access and try again. Locks::mutator_lock_SharedUnlock(this)。 return static_castThreadState(old_state)。 Thread類的成員函數(shù)TransitionFromSuspendedToRunnable的實(shí)現(xiàn)很簡(jiǎn)單,它通過(guò)一個(gè)do...while循環(huán)不斷地判斷自己是否有一個(gè)掛起請(qǐng)求。被喚醒之后,又在獲取Locks類的靜態(tài)成員變量mutator_lock_描述的一個(gè)讀寫(xiě)鎖的讀訪問(wèn)的前提下,將自己的狀態(tài)設(shè)置為運(yùn)行狀態(tài),即kRunnable。否則的話,就說(shuō)明又可能有其它線程請(qǐng)求將自己掛起,因此Thread類的成員函數(shù)TransitionFromSuspendedToRunnable又需要釋放之前獲得的讀寫(xiě)鎖的讀訪問(wèn),然后再重新執(zhí)行一遍do...while循環(huán)。假設(shè)執(zhí)行GC的線程在調(diào)用ThreadList類的成員函數(shù)SuspendAll獲得Locks類的靜態(tài)成員變量mutator_lock_描述的讀寫(xiě)鎖的寫(xiě)訪問(wèn)之前,當(dāng)前線程還沒(méi)有獲得該讀寫(xiě)鎖的讀訪問(wèn),那么很明顯當(dāng)它要獲得讀訪問(wèn)時(shí),就會(huì)進(jìn)入等待狀態(tài),因?yàn)樽x寫(xiě)鎖的讀訪問(wèn)和寫(xiě)訪問(wèn)是互斥的。等到當(dāng)前線程再調(diào)用Thread類的成員函數(shù)TransitionFromSuspendedToRunnable獲得該讀寫(xiě)鎖的讀訪問(wèn)時(shí),就會(huì)進(jìn)入等待狀態(tài)了。 ...... Locks::mutator_lock_ExclusiveUnlock(self)。 MutexLock mu2(self, *Locks::thread_suspend_count_lock_)。 // Decrement the suspend counts for all threads. for (const autoamp。 } threadModifySuspendCount(self, 1, false)。 } ...... } 這個(gè)函數(shù)定義在文件art/runtime/。 3. InitializePhase MarkSweep、PartialMarkSweep和StickyMarkSweep三個(gè)類的初始化階段都是相同的,都是由MarkSweep類的成員函數(shù)InitializePhase來(lái)實(shí)現(xiàn),如下所示:[cpp] view plain copy 在CODE上查看代碼片派生到我的代碼片void MarkSweep::InitializePhase() { ()。timings_)。 DCHECK(mark_stack_ != nullptr)。 soft_reference_list_ = nullptr。 finalizer_reference_list_ = nullptr。 cleared_reference_list_ = nullptr。 freed_large_object_bytes_ = 0。 freed_large_objects_ = 0。 array_count_ = 0。 large_object_test_ = 0。 classes_marked_ = 0。 work_chunks_created_ = 0。 reference_count_ = 0。 CHECK(java_lang_Class_ != nullptr)。 // Do any pre GC verification. (PreGcVerification)。 } 這個(gè)函數(shù)定義在文件art/runtime/gc/collector/。timings_)。 space : GetHeap()GetContinuousSpaces()) { if (spaceGetGcRetentionPolicy() == space::kGcRetentionPolicyAlwaysCollect) { current_mark_bitmap_ = spaceGetMarkBitmap()。 return。 從這里的就可以看出,Default Mark Bitmap就是回收策略為kGcRetentionPolicyAlwaysCollect的Space對(duì)應(yīng)的Mark Bitmap。 獲得的Default Mark Bitmap保存在MarkSweep類的成員變量current_mark_bitmap_中。timings_)。 BindBitmaps()。 // Process dirty cards and add dirty cards to mod union tables. heap_ProcessCards(timings_)。t want any threads to add references to // the live stack during the recursive mark. (SwapStacks)。 WriterMutexLock mu(self, *Locks::heap_bitmap_lock_)。 } else { MarkThreadRoots(self)。 } live_stack_freeze_size_ = heap_GetLiveStack()Size()。 heap_UpdateAndMarkModUnion(this, timings_, GetGcType())。 } 這個(gè)函數(shù)定義在文件art/runtime/gc/collector/。 B. 調(diào)用成員函數(shù)FindDefaultMarkBitmap找到回收策略為kGcRetentionPolicyAlwaysCollect的Space對(duì)應(yīng)的Mark Bitmap,并且保存在成員變量current_mark_bitmap_中。 C. 調(diào)用Heap類的成員函數(shù)ProcessCards處理Card Table中的Dirty Card,以及這些Dirty Card添加到對(duì)應(yīng)的Mod Union Table中去。 E. 對(duì)于非并行GC,當(dāng)前線程在掛起其它ART運(yùn)行時(shí)線程的過(guò)程中,已經(jīng)獲得Locks類的靜態(tài)成員變量mutator_lock_描述的讀寫(xiě)鎖的寫(xiě)訪問(wèn),因此這時(shí)候就調(diào)用成員函數(shù)MarkRoots來(lái)標(biāo)記那些不可以在沒(méi)有獲得Locks類的靜態(tài)成員變量mutator_lock_描述的讀寫(xiě)鎖的情況下訪問(wèn)的根集對(duì)象。 F. 對(duì)于并行GC,由于標(biāo)記階段并沒(méi)有掛起其它的ART運(yùn)行時(shí)線程,因此這時(shí)候就調(diào)用成員函數(shù)MarkThreadRoots來(lái)并發(fā)標(biāo)記那些不可以在沒(méi)有獲得Locks類的靜態(tài)成員變量mutator_lock_描述的讀寫(xiě)鎖的情況下訪問(wèn)的位于線程調(diào)用棧中的根集對(duì)象,接著再在當(dāng)前線程中調(diào)用成員函數(shù)MarkNonThreadRoots標(biāo)記那些不可以在沒(méi)有獲得Locks類的靜態(tài)成員變量mutator_lock_描述的讀寫(xiě)鎖的情況下訪問(wèn)的其它根集對(duì)象。注意,這時(shí)候Live Stack的大小即為交換Allocation Stack和Live Stack之前Allocation Stack的大小,即從上次GC以來(lái)新分配的對(duì)象的個(gè)數(shù)。 I. 調(diào)用Heap類的成員函數(shù)UpdateAndMarkModUnion處理Mod Union Table中的Dirty Card。 上述就是GC的標(biāo)記階段,它是一個(gè)很復(fù)雜的過(guò)程,涉及到的關(guān)鍵函數(shù)有MarkSweep類的成員函數(shù)BindBitmap、MarkRoots、MarkThreadRoots、MarkNonThreadRoots、MarkConcurrentRoots和MarkReachableObjects,以及Heap類的成員函數(shù)ProcessCards、SwapStacks和UpdateAndMarkModUnion。 在前面一文中,我們提到,Mark Sweep、Partial Mark Sweep和Sticky Mark Sweep的回收范圍是不同的,它們分別通過(guò)實(shí)現(xiàn)的自己的成員函數(shù)BindBitmap來(lái)限定回收范圍,因此,接下來(lái)我們就分別分析MarkSweep、PartialMarkSweep和StickyMarkSweep三個(gè)類的成員函數(shù)BindBitmap的實(shí)現(xiàn)。 WriterMutexLock mu(Thread::Current(), *Locks::heap_bitmap_lock_)。 space : GetHeap()GetContinuousSpaces()) { if (spaceGetGcRetentionPolicy() == space::kGcRetentionPolicyNeverCollect) { ImmuneSpace(space)。 } 這個(gè)函數(shù)定義在文件art/runtime/gc/collector/。從前面一文可以知道,回收策略為kGcRetentionPolicyNeverCollect的Space就是Image Space,因此,MarkSweep類就只對(duì)Zygote Space和Allocation Space進(jìn)行GC。 } // Add the space to the immune region. if (immune_begin_ == NULL) { DCHECK(immune_end_ == NULL)。 } else { const space::ContinuousSpace* prev_space = nullptr。 } prev_space = cur_space。amp。amp。 immune_end_ = std::max(reinterpret_castObject*(spaceEnd()), immune_end_)。 MarkSweep類的成員函數(shù)ImmuneSpace首先是判斷參數(shù)space描述的Space的Live Bitmap和Mark Bitmap是否是同一個(gè)Bitmap。一般來(lái)說(shuō),一個(gè)Space的Live Bitmap和Mark Bitmap指向的是不同的Bitmap的,但是Image Space比較特殊,它們指向的是同一個(gè)Bitmap。 如果之前有Space也被設(shè)置為不進(jìn)行回收,那么除了調(diào)用成員函數(shù)BindLiveToMarkBitmap交換參數(shù)space描述的Space的Live Bitmap和Mark Bitmap之外,MarkSweep類的成員函數(shù)ImmuneSpace還會(huì)參數(shù)space描述的Space占用的內(nèi)存區(qū)域與之前也被設(shè)置為不進(jìn)行回收的Space占用的內(nèi)存區(qū)域進(jìn)行合并,最后將得到的不會(huì)被回收的內(nèi)存總區(qū)域的開(kāi)始位置和結(jié)束位置記錄在MarkSweep類的成員變量immune_begin_ 和immune_end_中。 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 re
點(diǎn)擊復(fù)制文檔內(nèi)容
外語(yǔ)相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1