成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

.Net GC從空閑列表里面分配對(duì)象

開發(fā) 前端
當(dāng)進(jìn)行一個(gè)對(duì)象分配的時(shí)候,如果是慢速分配(JIT_New)的時(shí)候,它會(huì)查找空閑列表里面是否有足夠的空間來分配這個(gè)對(duì)象。如果有就把這個(gè)對(duì)象放到空閑列表里面去。

1.前言

空閑列表(free_list)實(shí)質(zhì)上是GC經(jīng)過垃圾回收之后形成的碎片空間,它的空間可以進(jìn)行重新分配新的對(duì)象。本篇看下它的重新分配過程。

2.概述

當(dāng)進(jìn)行一個(gè)對(duì)象分配的時(shí)候,如果是慢速分配(JIT_New)的時(shí)候,它會(huì)查找空閑列表里面是否有足夠的空間來分配這個(gè)對(duì)象。如果有就把這個(gè)對(duì)象放到空閑列表里面去。

CLR堆棧如下:

>  WKS::gc_heap::a_fit_free_list_p  C++
   WKS::gc_heap::soh_try_fit  C++
   WKS::gc_heap::allocate_soh  C++
   WKS::gc_heap::try_allocate_more_space  C++
   WKS::gc_heap::allocate_more_space  C++
   WKS::gc_heap::allocate  C++
   WKS::GCHeap::Alloc  C++
   Alloc  C++
   AllocateObject  C++
   JIT_New  C++
//此處省略一萬行
   RtlUserThreadStart()  未知

著重看下這個(gè)a_fit_free_list_p函數(shù),它就是進(jìn)行空閑列表分配,關(guān)鍵代碼如下:

BOOL gc_heap::a_fit_free_list_p (int gen_number,
                                 size_t size,
                                 alloc_context* acontext,
                                 uint32_t flags,
                                 int align_const)
{
    BOOL can_fit = FALSE;
    //獲取當(dāng)前收集代地址
    generation* gen = generation_of (gen_number);
    //獲取當(dāng)前收集代 空閑列表一直
    allocator* gen_allocator = generation_allocator (gen);
    //遍歷冫空閑列表里面的bucket,找到何時(shí)的空間存儲(chǔ)對(duì)象
    for (unsigned int a_l_idx = gen_allocator->first_suitable_bucket(size); a_l_idx < gen_allocator->number_of_buckets(); a_l_idx++)
    {
        //索引的空閑列表的頭部指針
        uint8_t* free_list = gen_allocator->alloc_list_head_of (a_l_idx);
        uint8_t* prev_free_item = 0;
        //如果獲取到的空閑列表空間不為0
        while (free_list != 0)
        {
            //獲取當(dāng)前索引空閑了free_list里面bucket的長度
            size_t free_list_size = unused_array_size (free_list);
           //如果需要分配對(duì)象長度小于free_lis里面獲取的長度,那么表示對(duì)象可以放入空閑列表
            if ((size + Align (min_obj_size, align_const)) <= free_list_size)
            {
                //unlink,斷開鏈接。意思是從空閑列表里面把空間拿出來,因?yàn)樗僮鞯氖擎湵怼?                // 把獲取到的free_lsit的bucket長度從free_lsit鏈表里面拿掉,也就是個(gè)鏈表操作
                gen_allocator->unlink_item (a_l_idx, free_list, prev_free_item, FALSE);
                //計(jì)算出對(duì)象需要的空間也就是參數(shù)size,最終需要分配的長度
                size_t limit = limit_from_size (size, flags, free_list_size, gen_number, align_const);
                //收集代靜態(tài)數(shù)據(jù)new_allocation減去對(duì)象最終分配空間大小
                dd_new_allocation (dynamic_data_of (gen_number)) -= limit;
                //空閑列表頭部指針+對(duì)象占用空間大小,指向的是剩余的空間地址
                uint8_t*  remain = (free_list + limit);
                // 當(dāng)前代的空閑列表大小減去分配對(duì)象的大小,剩余值remain_size
                size_t remain_size = (free_list_size - limit);
                //如果剩余值,大于或者等于一個(gè)空閑列表的大小
                if (remain_size >= Align(min_free_list, align_const))
                {
                   //重新把它作為空閑列表,放入free_list的bucket里面去
                    make_unused_array (remain, remain_size);
                    gen_allocator->thread_item_front (remain, remain_size);
                    assert (remain_size >= Align (min_obj_size, align_const));
                }
                else  //如果剩余值小于
                {
                    //這里直接把剩余值給分配對(duì)象大小得了,也就是上面計(jì)算的分配對(duì)象大小+剩余的空間
                    limit += remain_size;
                }
                //代的空閑空間減去對(duì)象需要的空間 
                generation_free_list_space (gen) -= limit;
                assert ((ptrdiff_t)generation_free_list_space (gen) >= 0);
                //把a(bǔ)lloc_context指向計(jì)算的空間,對(duì)象就分配到alloc_context指向的地址
                adjust_limit_clr (free_list, limit, size, acontext, flags, 0, align_const, gen_number);


                can_fit = TRUE;
                goto end;
            }         
        }
    }
end:
    return can_fit;
}

以上整體的思路是

1.先找到當(dāng)前垃圾回收的代
2.通過這個(gè)代找到次代的空閑列表
3.遍歷循環(huán)空閑列表里的number_of_buckets,以找到合適的空間放置需要分配的對(duì)象
4.如果找到了此空間,就設(shè)置alloc_context指向此空間。對(duì)象分配就通過alloc_context來分配。

它這個(gè)整體上是操作空閑列表管理類,然后通過空閑列表管理類給對(duì)象分配空間。

責(zé)任編輯:武曉燕 來源: 江湖評(píng)談
相關(guān)推薦

2023-03-26 00:43:42

JVM對(duì)象測試

2009-11-03 13:33:39

VB.NET對(duì)象列表

2009-04-30 16:21:37

VB.NET通用對(duì)象列表

2017-08-28 10:13:09

國家分配對(duì)象

2010-09-03 11:16:54

SQL刪除

2009-06-18 13:30:12

List(T).NET

2022-12-12 08:42:06

Java對(duì)象棧內(nèi)存

2018-02-08 14:57:22

對(duì)象內(nèi)存分配

2009-10-27 13:05:37

VB.NET對(duì)象列表

2018-07-30 10:50:15

存儲(chǔ)管理查找排序

2021-01-06 09:47:51

內(nèi)存Go語言

2012-09-29 09:22:24

.NETGC內(nèi)存分配

2013-08-21 17:20:49

.NET面向?qū)ο?/a>

2012-01-11 11:07:04

JavaJVM

2022-08-08 06:48:56

JS語言對(duì)象

2012-09-29 10:29:56

.Net內(nèi)存分配繼承

2015-11-16 11:22:05

Java對(duì)象內(nèi)存分配

2018-04-08 08:45:53

對(duì)象內(nèi)存策略

2021-08-03 09:02:58

LinuxSlab算法

2013-11-07 09:42:42

對(duì)象對(duì)象池加速
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 一呦二呦三呦国产精品 | 欧美成视频 | 日韩在线免费 | 色爱综合| 四虎影院新网址 | 亚洲国产成人av好男人在线观看 | 国产精品一区在线 | 日本欧美大片 | 一区二区中文字幕 | 精品日韩一区二区三区av动图 | 久久麻豆精品 | 欧美国产视频 | 国产ts人妖系列高潮 | 中文字幕av亚洲精品一部二部 | 欧美激情免费在线 | 成人午夜免费视频 | 国产一在线 | 亚洲精品中文字幕 | 欧美精品一区三区 | 操人网 | 欧美一区二区网站 | 在线国产视频 | 欧美国产日韩一区 | 中文字幕日韩欧美 | 欧洲成人免费视频 | 日韩欧美国产不卡 | 亚洲综合一区二区三区 | 欧美一区免费 | 国产精品视屏 | 99re| 亚洲一区二区三区视频 | www.国产一区 | 亚洲二区在线 | 日韩精品久久一区二区三区 | 日韩欧美三级电影 | 自拍偷拍av | 福利视频网 | 成人精品国产 | 国产一区二区三区高清 | www国产成人免费观看视频,深夜成人网 | 欧美三级视频在线观看 |