首页 > 其他分享 >.Net7自定义GC垃圾回收器

.Net7自定义GC垃圾回收器

时间:2023-10-08 11:22:21浏览次数:44  
标签:自定义 回收 Custom GC result Net7 CLR

1.前言

CLR和GC高度耦合,.Net7里面分离CLR和GC,则比较容易实现这件事情。本篇来看下,自定义一个GC垃圾回收器。

2.概述

这里首先演示下自定义GC垃圾回收后的效果。
1.下载Custom.dll
2.找到当前.Net目录,比如这里的7.0.10

C:\Program Files\dotnet\shared\Microsoft.NETCore.App\7.0.10

把Custom.dll复制到此目录
3.比如有以下C#代码:

 static void Main(string[] args){
     Console.WriteLine("Hello Main");
     Program pm = new Program();
     pm = null;
     GC.Collect();
 }

在项目属性-》调试-》常规-》打开调试启动配置文件UI-》环境变量里面填写如下键值:

名称:DOTNET_GCName
值:Custom.dll

4.运行此段代码,显示如下
image
hello Jianghupt这三条语句就是Custom.dll里面自定义了GC的标识效果。表示它是自定义的。
5.原理
CLR在初始化的时候,会判断是否有DOTNET_GCName环境变量,如果有则替换掉默认的GC回收器,用DOTNET_GCName指定的GC回收器。这里很明显的就是进入了自定义垃圾回收器里面去了。如果取消掉DOTNET_GCName环境变量,则不会有这三句话。可以自己去尝试下。


如何自定义GC垃圾回收呢?

自定义GC垃圾回收器,需要进行如下操作。新建一个C++ DLL库项目
引入两个头文件,实现三个接口

#include "gcenv.base.h"
#include "gcinterface.h"

IGCHandleManager
IGCHandleStore
IGCHeap

需要导出两个函数

extern "C" DLLEXPORT HRESULT
GC_Initialize(
    /* In */  IGCToCLR* clrToGC,
    /* Out */ IGCHeap** gcHeap,
    /* Out */ IGCHandleManager** gcHandleManager,
    /* Out */ GcDacVars* gcDacVars
)
{
    printf("Hello Jianghupt! This Is Custom GC Into CLR!!!!!!!!!\r\n");
    printf("Hello Jianghupt! Welcom To Customer GC CLR!!!!!!!!!\r\n");
    printf("Hello Jianghupt! Microsfot The GC Update Customer!!!!!!!!!\r\n");
    IGCHeap* heap = new CustomGCHeap(clrToGC);
    IGCHandleManager* handleManager = new CustomGCHandleManager();
    *gcHeap = heap;
    *gcHandleManager = handleManager;
    return S_OK;
}

extern "C" DLLEXPORT void
GC_VersionInfo(
    /* Out */ VersionInfo* result
)
{
	result->MajorVersion = GC_INTERFACE_MAJOR_VERSION;
	result->MinorVersion = GC_INTERFACE_MINOR_VERSION;
    result->BuildVersion = 0;
    result->Name = "Custom";
}

可以看到GC_Initialize里面的三句话,就是上面控制台显示的三句话。这个时候它实际上已经进入到了自定义GC里面去了。

源码下载

有任何问题,可以关注公众号(jianghupt),了解更多。
image

标签:自定义,回收,Custom,GC,result,Net7,CLR
From: https://www.cnblogs.com/tangyanzhi1111/p/17748346.html

相关文章

  • Langchain-Chatchat项目:1-整体介绍
      基于Langchain与ChatGLM等语言模型的本地知识库问答应用实现。项目中默认LLM模型改为THUDM/chatglm2-6b[2],默认Embedding模型改为moka-ai/m3e-base[3]。一.项目介绍1.实现原理  本项目实现原理如下图所示,过程包括加载文件->读取文本->文本分割->文本向量化->问句向量化->......
  • Langchain-Chatchat项目:1.1-ChatGLM2项目整体介绍
      ChatGLM2-6B是开源中英双语对话模型ChatGLM-6B的第2代版本,引入新的特性包括更长的上下文(基于FlashAttention技术,将基座模型的上下文长度由ChatGLM-6B的2K扩展到了32K,并在对话阶段使用8K的上下文长度训练);更高效的推理(基于Multi-QueryAttention技术,ChatGLM2-6B有更高效的推理......
  • Langchain-Chatchat项目:1.2-Baichuan2项目整体介绍
      由百川智能推出的新一代开源大语言模型,采用2.6万亿Tokens的高质量语料训练,在多个权威的中文、英文和多语言的通用、领域benchmark上取得同尺寸最佳的效果,发布包含有7B、13B的Base和经过PPO训练的Chat版本,并提供了Chat版本的4bits量化。一.Baichuan2模型  Baichuan2模型在......
  • Langchain-Chatchat项目:2.1-通过GPT2模型来检索NebulaGraph
      在官方例子中给出了通过chain=NebulaGraphQAChain.from_llm(ChatOpenAI(temperature=0),graph=graph,verbose=True)来检索NebulaGraph图数据库。本文介绍了通过GPT2替换ChatOpenAI的思路和实现,暂时不考虑效果。之所以没用ChatGLM2是因为加载模型太慢,调试不方便,不过将GPT2......
  • Langchain-Chatchat项目:3-Langchain计算器工具Agent思路和实现
      本文主要讨论Langchain-Chatchat项目中自定义Agent问答的思路和实现。以"计算器工具"为例,简单理解就是通过LLM识别应该使用的工具类型,然后交给相应的工具(也是LLM模型)来解决问题。一个LLM模型可以充当不同的角色,要把结构化的Prompt模板写好,充分利用LLM的Zero/One/Few-Shot能力......
  • 题解 AGC015D【A or...or B Problem】
    题解AGC015D【Aor...orBProblem】problem从\(\geA\)且\(\leB\)的整数中选择一个或多个,把这些整数按位或,求一共有多少种可能的结果。\(1\leA\leB\le2^{60}\)solution首先暴力怎么写呢?FWT。设序列\(a_i=[L\leqi\leqR]\),然后对它FWT-or之后自己乘几倍,再翻回......
  • 20231306 gcc测试
    通过homebrew安装gcc2.检测gcc安装成功3.创建文件夹“my_program.c"并编写代码4.创建文件“my_program"并用gcc进行预处理......
  • CefSharp自定义滚动条样式
    在WinForm/WPF中使用CefSharp混合开发时,通常需要自定义滚动条样式,以保证应用的整体风格统一。本文将给出一个简单的示例介绍如何自定义CefSharp中滚动条的样式。基本思路在前端开发中,通过CSS来控制滚动条的样式是件寻常的事情。CefSharp也提供了功能强大的API方便开发人员使用c#......
  • Go 复合数据类型之结构体与自定义类型
    Go复合数据类型之结构体与自定义类型目录Go复合数据类型之结构体与自定义类型一、类型别名和自定义类型1.1类型定义(TypeDefinition)简单示例1.2类型别名简单示例1.3类型定义和类型别名的区别二、结构体2.1结构体介绍2.2结构体的定义2.3定义一个空结构体2.3.1空结构体介......
  • [SpringCloud 01] RestTemplate Ribbon Feign
    SpringCloud11.RestTemplatespringcloud是基于rest的框架,所以在调用其他服务的时候,可以支持用restTemplate来调用.可以在spring中首先用@Bean的方式把ResTemplate放入spring容器@ConfigurationpublicclassMyConfig{@BeanpublicRestTemplategetRestTem......