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.运行此段代码,显示如下



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),了解更多。

.Net7自定义GC垃圾回收器的更多相关文章

  1. [Java基础]-- Java GC 垃圾回收器的分类和优缺点

    https://blog.csdn.net/high2011/article/details/80177473?utm_source=blogxgwz2 参考:elasticsearch实战-使用G1 ...

  2. 一篇文章让你了解GC垃圾回收器

    简单了解GC垃圾回收器 了解GC之前我们首先要了解GC是要做什么的?顾名思义回收垃圾,什么是垃圾呢? GC回收的垃圾主要指的是回收堆内存中的垃圾对象. 从根对象出发,所有被引用的对象,都是存活对象 其 ...

  3. .NET GC垃圾回收器

    GC垃圾回收器简介 全名: Garbage Collector 原理: 以应用程序的根(root)为基础,遍历应用程序堆(heap)上动态分配的所有对象,通过识别它们是否被引用来确定哪些对象是已经死亡 ...

  4. 如何获取GC(垃圾回收器)的STW(暂停)时间?

    前言 在现代的容器化和微服务应用中,因为分布式的环境和错综复杂的调用关系,APM(Application Performance Monitoring 应用性能监控)显得尤为重要,它通过采集应用程序各 ...

  5. GC垃圾回收器

    java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”.jvm解决的两个问题:给对象分配内存以及回收分配给对象的内存.GC:将内存中不再被使用的对象进行回收.GC的作用域是JVM运行时 ...

  6. GC(垃圾回收器)中的算法

    GC的两种判定方法 (1) 引用计数法 给对象添加一个引用计数器,每当引用一次+1,每次失效时-1,当计数器为0时,表示对象就是不可能再被使用的. (2) 可达性分析算法 将“GC Roots”对象作 ...

  7. Java虚拟机笔记(二):GC垃圾回收和对象的引用

    为什么要了解GC 我们都知道Java开发者在开发过程中是不需要关心对象的回收的,因为Java虚拟机的原因,它会自动回收那些失效的垃圾对象.那我们为什么还要去了解GC和内存分配呢? 答案很简单:当我们需 ...

  8. Android内存优化5 了解java GC 垃圾回收机制3

    引言 接App优化之内存优化(序), 作为App优化系列中内存优化的一个小部分. 由于内存相关知识比较生涩, 内存优化中使用到的相关工具, 也有很多专有名词. 对Java内存管理, GC, Andro ...

  9. 牛客网Java刷题知识点之垃圾回收算法过程、哪些内存需要回收、被标记需要清除对象的自我救赎、对象将根据存活的时间被分为:年轻代、年老代(Old Generation)、永久代、垃圾回收器的分类

    不多说,直接上干货! 首先,大家要搞清楚,java里的内存是怎么分配的.详细见 牛客网Java刷题知识点之内存的划分(寄存器.本地方法区.方法区.栈内存和堆内存) 哪些内存需要回收 其实,一般是对堆内 ...

  10. C#.Net GC(garbage Collector) 垃圾回收器

    以前一直以为gc的原理很简单,也就是分代处理堆数据,直到我的膝盖中了一箭(好吧 直到有天汪涛和我说他面试携程的面试题 关于服务器和 工作站gc 的区别)其实我当时尚不知道 工作站和服务器有什么区别更不 ...

随机推荐

  1. 基于Sa-Token实现微服务之前的单点登录

    修改配置文件,准备好四个域名 127.0.0.1 auth.server.com 127.0.0.1 user.server.com 127.0.0.1 third.server.com 127.0. ...

  2. MySQL存储之为什么要使用B+树做为储存结构?

    导言: 在使用MySQL数据库的时候,我们知道了它有两种物理存储结构,hash存储和B+树存储,由于hash存储使用的少,而B+树存储使用的范围就多些,如 InnoDB和MYISAM引擎都是使用的B+ ...

  3. 国产开源流批统一的数据同步工具Chunjun入门实战

    @ 目录 概述 定义 特性 部署 安装 版本对应关系 通用配置详解 整体配置 Content 配置 Setting 配置 Local提交 Standalone提交 Json方式使用 SQL方式使用 M ...

  4. requests的基础使用

    爬虫介绍 # 爬虫:又称网络蜘蛛,spider,一堆程序,从互联网中抓取数据---->数据清洗---->入库 # 爬虫需要掌握的知识 -抓取数据:发送网络请求(http),获得响应(htt ...

  5. 1.8 运用C编写ShellCode代码

    在笔者前几篇文章中,我们使用汇编语言并通过自定位的方法实现了一个简单的MessageBox弹窗功能,但由于汇编语言过于繁琐在编写效率上不仅要考验开发者的底层功底,还需要写出更多的指令集,这对于普通人来 ...

  6. freeswitch的mod_cdr_csv模块

    概述 freeswitch是一款简单好用的VOIP开源软交换平台. 在语音呼叫的过程中,话单是重要的计价和结算依据,话单的产生需要稳定可靠,可回溯. fs中基本的话单模块mod_cdr_csv,可以满 ...

  7. VS2017配置OpenCV

    VS2017配置OpenCV 0 OpenCV介绍 OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,它提供了丰富的图像处理和计算机视觉算 ...

  8. 一步一图带你构建 Linux 页表体系 —— 详解虚拟内存如何与物理内存进行映射

    笔者之前在自己的专栏<聊聊 Linux 内核> 里通过大量的篇幅写了一个系列关于内存管理相关的文章,在这个系列文章中,笔者分别通过虚拟内存管理和物理内存管理两个角度算是把 Linux 内存 ...

  9. ubuntu安装rpm格式包

    首先,我们要安装alien这一软件: $sudo apt-get install alien ##alien默认没有安装,所以首先要安装它 $sudo alien xxxx.rpm ##将rpm转换为 ...

  10. Ehcache的Maven依赖及其配置文件

    Ehcache的Maven依赖 <!-- https://mvnrepository.com/artifact/org.mybatis.caches/mybatis-ehcache --> ...