经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » ASP.net » 查看文章
.Net7自定义GC垃圾回收器
来源:cnblogs  作者:江湖评谈  时间:2023/10/9 9:27:45  对本文有异议

1.前言

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

2.概述

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

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

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

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

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

  1. 名称:DOTNET_GCName
  2. 值:Custom.dll

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


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

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

  1. #include "gcenv.base.h"
  2. #include "gcinterface.h"
  3. IGCHandleManager
  4. IGCHandleStore
  5. IGCHeap

需要导出两个函数

  1. extern "C" DLLEXPORT HRESULT
  2. GC_Initialize(
  3. /* In */ IGCToCLR* clrToGC,
  4. /* Out */ IGCHeap** gcHeap,
  5. /* Out */ IGCHandleManager** gcHandleManager,
  6. /* Out */ GcDacVars* gcDacVars
  7. )
  8. {
  9. printf("Hello Jianghupt! This Is Custom GC Into CLR!!!!!!!!!\r\n");
  10. printf("Hello Jianghupt! Welcom To Customer GC CLR!!!!!!!!!\r\n");
  11. printf("Hello Jianghupt! Microsfot The GC Update Customer!!!!!!!!!\r\n");
  12. IGCHeap* heap = new CustomGCHeap(clrToGC);
  13. IGCHandleManager* handleManager = new CustomGCHandleManager();
  14. *gcHeap = heap;
  15. *gcHandleManager = handleManager;
  16. return S_OK;
  17. }
  18. extern "C" DLLEXPORT void
  19. GC_VersionInfo(
  20. /* Out */ VersionInfo* result
  21. )
  22. {
  23. result->MajorVersion = GC_INTERFACE_MAJOR_VERSION;
  24. result->MinorVersion = GC_INTERFACE_MINOR_VERSION;
  25. result->BuildVersion = 0;
  26. result->Name = "Custom";
  27. }

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

源码下载

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

原文链接:https://www.cnblogs.com/tangyanzhi1111/p/17748346.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号