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. 从 SpringApplication 认识 Spring 应用启动过程

    一.SpringApplication 是什么? Spring 应用的启动类. 二.SpringApplication 执行了什么? 创建 ApplicationContext 实例 Applicat ...

  2. [MAUI]弧形进度条与弧形滑块的交互实现

    @ 目录 弧形基类 定义 绘制弧 弧形进度条(ProgressBar) 添加动画 宽度补偿 文本 弧形滑块(Slider) 创建控制柄 拖动事件处理 项目地址 进度条(ProgressBar)用于展示 ...

  3. PHP文件包含总结

    1.文件包含小知识 1.1 包含函数 PHP共有4个与文件包含相关的函数: include require include_once require_once include与include_once ...

  4. Java 集合框架体系简介

    为什么要使用集合 存储多个数据可以使用数组,但由于数组在内存中是连续存储的,所以会有一些限制.比如数组在创建时就要指定长度,即可以容纳的元素个数,且指定后无法更改:数组在创建时需要指定元素的类型,并且 ...

  5. 国标GB28181协议客户端开发(四)实时视频数据传输

    国标GB28181协议客户端开发(四)实时视频数据传输 本文是<国标GB28181协议设备端开发>系列的第四篇,介绍了实时视频数据传输的过程.通过解读INVITE报文中的SDP信息,读取和 ...

  6. animation动画+关键帧实现轮播图效果(再次学习)!

    再次遇到要实现轮播图效果的时候,发现还是不怎么会,因为对js还没有熟练使用,只希望使用h5和css3实现效果 虽然之前已经学习了一遍了,但是还是不熟练,再次学习一下了 这次的可作为套板使用,无序列表为 ...

  7. Hexo博客yilia主题文章添加目录

    参考文章 添加目录的文章有一些是自己添加css文件和修主题配置 作者也更新了文章大体目录的功能 打开配置文件themes/yilia/_config.yml 你可以选择toc设置为1 或者2 toc: ...

  8. 基于Avalonia 11.0.0+ReactiveUI 的跨平台项目开发1-通用框架

    基于Avalonia 11.0.0+ReactiveUI 的跨平台项目开发1-通用框架 Avalonia简介: Avalonia是.NET的一个跨平台UI框架,提供了一个灵活的样式系统,支持广泛的操作 ...

  9. Oracle定时任务(执行某一SQL语句)

    Oracle定时任务,是定时调用存储过程,执行存储过程中的SQl语句 SQl实例 建立存储过程 -- 建立存储过程 CREATE or replace PROCEDURE UPDATE_AGENCY ...

  10. Linux实现双击自动安装deb文件

    在Linux中,有几个常用的软件可以实现双击自动安装.deb文件的功能.以下是一些推荐的软件: 1. GDebi:GDebi是一个轻量级的图形化工具,专门用于安装.deb文件.它可以解决依赖关系,并提 ...