前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >.Net CLR GC存活标记及固定对象的设置

.Net CLR GC存活标记及固定对象的设置

作者头像
江湖评谈
发布2023-09-22 08:25:59
1430
发布2023-09-22 08:25:59
举报
文章被收录于专栏:天下风云天下风云

1.前言 存活标记,意即当进行垃圾回收的时候被存活对象需要进行标记。固定对象即在GC堆不能被移动的对象,它也是通过标记来标注它是否是固定对象。本篇来看下它们是如何标记的。

2.参考

固定对象可以参考:.Net8罕见的技术:固定对象的操作

垃圾回收GCinfo参考:GC垃圾回收的GCInfo编码过程

3.概述 一.设置存活对象:

代码语言:javascript
复制
void SetMarked()
{
     _ASSERTE(RawGetMethodTable());
     RawSetMethodTable((MethodTable *) (((size_t) RawGetMethodTable()) | GC_MARKED));
 }

很好理解,把MethodTable最后一位设置为1,即此对象存活。

二.获取对象是否存活

代码语言:javascript
复制
BOOL IsMarked() const
{
     return !!(((size_t)RawGetMethodTable()) & GC_MARKED);
}

也很简单,看MethodTable最后一位是否为1

三.设置对象为固定对象

代码语言:javascript
复制
void SetPinned()
{
   assert (!(gc_heap::settings.concurrent));
   GetHeader()->SetGCBit();
}

看到GetHeader()是获取对象头,SetGCBit里面是跟对象头或(|)0x20000000.

也即对象头的高三位设置为1.

四.判断对象是否固定对象

代码语言:javascript
复制
BOOL IsPinned() const
{
    return !!((((CObjectHeader*)this)->GetHeader()->GetBits()) & BIT_SBLK_GC_RESERVE);
}

判断对象头的高三位是否为1就行了

五.清除标记

代码语言:javascript
复制
void ClearMarked()
{
#ifdef DOUBLY_LINKED_FL
        RawSetMethodTable ((MethodTable *)(((size_t) RawGetMethodTable()) & (~GC_MARKED)));
#else
        RawSetMethodTable (GetMethodTable());
#endif //DOUBLY_LINKED_FL
    }

把MethodTable最后一位设置为0,即可。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-09-18 08:31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 江湖评谈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 垃圾回收GCinfo参考:GC垃圾回收的GCInfo编码过程
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档