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. MySQL 存储引擎 InnoDB 内存结构之更改缓冲区

    更改缓冲区(Change Buffer)是一种特殊的数据结构,用于缓存不在缓冲池中的二级索引(secondary index)页的更改.可能来自于INSERT.UPDATE或DELETE操作(数据操作 ...

  2. 怎么把 session 中的实体类转换回来

    例子 : 如上比如user user1=new user(): user1.id=1: user1.name="张三": session["user1"]=us ...

  3. 配置http协议访问Harbor镜像仓库

    解决http: server gave HTTP response to HTTPS client问题,此问题在上传与下载时均可能出现. 由于docker镜像拉取与推送服务使用的是https协议,但是 ...

  4. The server time zone value '?泄???????' is unrecognized or represents more t

    hibernate配置文件如下 运行在服务器上,报错如下 解决方案: 在jdbc连接的url后面加上serverTimezone=GMT即可解决问题,因为是数据库和系统时区差异所造成的, 即 < ...

  5. 说说 Go 语言的坑(二)

    上一篇文章 说说 Go 语言 for-range 的坑 说的是 for-range 的,工作中,其实还是遇到蛮多奇奇怪怪的问题,这里也顺便整理了一下,就当作是续集:) 先继续看 for-range 的 ...

  6. Java生成图片(简版)

    1.图片模板示例 2.Java代码(简版) public static void main(String[] args) throws FileNotFoundException, IOExcepti ...

  7. Axios向后段请求数据GET POST两种方法的不同之处

    GET请求 向后端请求时,通过URL向后端传递参数 axios({ url:'http://127.0.0.1:9000/get-user-list/', type:'json', //GET方法携带 ...

  8. openpyxl 设置某列单元格样式

    1 # 边框线 2 border_set = Border(left=Side(border_style='thin', color='000000'), 3 right=Side(border_st ...

  9. tensorflow.js 多分类,机器学习区分企鹅种类

    前言: 在规则编码中,我们常常会遇到需要通过多种区间判断某种物品分类.比如二手物品的定价,尽管不是新品没有 SKU 但是基本的参数是少不了.想通过成色来区分某种物品,其实主要是确定一些参数.然后根据参 ...

  10. Cilium系列-12-启用 Pod 的 BBR 拥塞控制

    系列文章 Cilium 系列文章 前言 将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能. 但是通过对 Cilium 不同模式的切换/功能的启用, ...