当前位置:首页 > 科技  > 软件

.Net GC从空闲列表里面分配对象

来源: 责编: 时间:2023-09-28 10:08:00 190观看
导读1.前言空闲列表(free_list)实质上是GC经过垃圾回收之后形成的碎片空间,它的空间可以进行重新分配新的对象。本篇看下它的重新分配过程。2.概述当进行一个对象分配的时候,如果是慢速分配(JIT_New)的时候,它会查找空闲列表

1.前言

空闲列表(free_list)实质上是GC经过垃圾回收之后形成的碎片空间,它的空间可以进行重新分配新的对象。本篇看下它的重新分配过程。uQ828资讯网——每日最新资讯28at.com

2.概述

当进行一个对象分配的时候,如果是慢速分配(JIT_New)的时候,它会查找空闲列表里面是否有足够的空间来分配这个对象。如果有就把这个对象放到空闲列表里面去。uQ828资讯网——每日最新资讯28at.com

CLR堆栈如下:uQ828资讯网——每日最新资讯28at.com

>  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()  未知

着重看下这个a_fit_free_list_p函数,它就是进行空闲列表分配,关键代码如下:uQ828资讯网——每日最新资讯28at.com

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;    //获取当前收集代地址    generation* gen = generation_of (gen_number);    //获取当前收集代 空闲列表一直    allocator* gen_allocator = generation_allocator (gen);    //遍历冫空闲列表里面的bucket,找到何时的空间存储对象    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)        {            //获取当前索引空闲了free_list里面bucket的长度            size_t free_list_size = unused_array_size (free_list);           //如果需要分配对象长度小于free_lis里面获取的长度,那么表示对象可以放入空闲列表            if ((size + Align (min_obj_size, align_const)) <= free_list_size)            {                //unlink,断开链接。意思是从空闲列表里面把空间拿出来,因为它操作的是链表。                // 把获取到的free_lsit的bucket长度从free_lsit链表里面拿掉,也就是个链表操作                gen_allocator->unlink_item (a_l_idx, free_list, prev_free_item, FALSE);                //计算出对象需要的空间也就是参数size,最终需要分配的长度                size_t limit = limit_from_size (size, flags, free_list_size, gen_number, align_const);                //收集代静态数据new_allocation减去对象最终分配空间大小                dd_new_allocation (dynamic_data_of (gen_number)) -= limit;                //空闲列表头部指针+对象占用空间大小,指向的是剩余的空间地址                uint8_t*  remain = (free_list + limit);                // 当前代的空闲列表大小减去分配对象的大小,剩余值remain_size                size_t remain_size = (free_list_size - limit);                //如果剩余值,大于或者等于一个空闲列表的大小                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  //如果剩余值小于                {                    //这里直接把剩余值给分配对象大小得了,也就是上面计算的分配对象大小+剩余的空间                    limit += remain_size;                }                //代的空闲空间减去对象需要的空间                 generation_free_list_space (gen) -= limit;                assert ((ptrdiff_t)generation_free_list_space (gen) >= 0);                //把alloc_context指向计算的空间,对象就分配到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;}

以上整体的思路是uQ828资讯网——每日最新资讯28at.com

1.先找到当前垃圾回收的代
2.通过这个代找到次代的空闲列表
3.遍历循环空闲列表里的number_of_buckets,以找到合适的空间放置需要分配的对象
4.如果找到了此空间,就设置alloc_context指向此空间。对象分配就通过alloc_context来分配。uQ828资讯网——每日最新资讯28at.com

它这个整体上是操作空闲列表管理类,然后通过空闲列表管理类给对象分配空间。uQ828资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-11847-0.html.Net GC从空闲列表里面分配对象

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 深度使用了下 Serverless,太丝滑了!

下一篇: 图文并茂解释 Java JVM、JRE 和 JDK

标签:
  • 热门焦点
  • K60至尊版刚预热 一加Ace2 Pro正面硬刚

    K60至尊版刚预热 一加Ace2 Pro正面硬刚

    Redmi这边刚如火如荼的宣传了K60 Ultra的各种技术和硬件配置,作为竞品的一加也坐不住了。一加中国区总裁李杰发布了两条微博,表示在自家的一加Ace2上早就已经采用了和PixelWo
  • 小米平板5 Pro 12.4简评:多专多能 兼顾影音娱乐的大屏利器

    小米平板5 Pro 12.4简评:多专多能 兼顾影音娱乐的大屏利器

    疫情带来了网课,网课盘活了安卓平板,安卓平板市场虽然中途停滞了几年,但好的一点就是停滞的这几年行业又有了新的发展方向,例如超窄边框、高刷新率、多摄镜头组合等,这就让安卓
  • Redmi Buds 4开箱简评:才199还有降噪 可以无脑入

    Redmi Buds 4开箱简评:才199还有降噪 可以无脑入

    在上个月举办的Redmi Note11T Pro系列新机发布会上,除了两款手机新品之外,Redmi还带来了两款TWS真无线蓝牙耳机产品,Redmi Buds 4和Redmi Buds 4 Pro,此前我们在Redmi Note11T
  • 6月安卓手机好评榜:魅族20 Pro蝉联冠军

    6月安卓手机好评榜:魅族20 Pro蝉联冠军

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年6月1日至6月30日,仅限国内市场。第一名:魅族20 Pro好评率:95%5月份的时候魅族20 Pro就是
  • 掘力计划第 20 期:Flutter 混合开发的混乱之治

    掘力计划第 20 期:Flutter 混合开发的混乱之治

    在掘力计划系列活动第20场,《Flutter 开发实战详解》作者,掘金优秀作者,Github GSY 系列目负责人恋猫的小郭分享了Flutter 混合开发的混乱之治。Flutter 基于自研的 Skia 引擎
  • 微信语音大揭秘:为什么禁止转发?

    微信语音大揭秘:为什么禁止转发?

    大家好,我是你们的小米。今天,我要和大家聊一个有趣的话题:为什么微信语音不可以转发?这是一个我们经常在日常使用中遇到的问题,也是一个让很多人好奇的问题。让我们一起来揭开这
  • 梁柱接棒两年,腾讯音乐闯出新路子

    梁柱接棒两年,腾讯音乐闯出新路子

    文丨田静 出品丨牛刀财经(niudaocaijing)7月5日,企鹅FM发布官方公告称由于业务调整,将于9月6日正式停止运营,这意味着腾讯音乐长音频业务走向消亡。腾讯在长音频领域还在摸索。为
  • 年轻人的“职场羞耻感”,无处不在

    年轻人的“职场羞耻感”,无处不在

    作者:冯晓亭 陶 淘 李 欣 张 琳 马舒叶来源:燃次元&ldquo;人在职场,应该选择什么样的着装?&rdquo;近日,在网络上,一个与着装相关的帖子引发关注,在该帖子里,一位在高级写字楼亚洲金
  • 超闭合精工铰链 彻底消灭缝隙 三星Galaxy Z Flip5与Galaxy Z Fold5发布

    超闭合精工铰链 彻底消灭缝隙 三星Galaxy Z Flip5与Galaxy Z Fold5发布

    2023年7月26日,三星电子正式发布了Galaxy Z Flip5与Galaxy Z Fold5。三星新一代折叠屏手机采用超闭合精工铰链,让折叠后的缝隙不再可见。同时,配合处
Top