- 博客(11)
- 收藏
- 关注
原创 CoreCLR 计划阶段(PlanPhase4)-计划代边界
本文应该是计划阶段的最后一篇了,之前已经讲了plug的构建和处理,最后需要进行的是计划代边界。
2025-04-08 17:21:38
256
原创 CoreCLR 计划阶段(PlanPhase3)-Pinned Plug的处理
上一篇文章中已经介绍了为普通的Plug分配空间,今天这篇文章将介绍Pinned Plug的处理方式。我们知道Pinned Plug物体可能被非托管代码访问,这就要求其所占任何时候(包括GC的时候)都不能移动,且不能被覆盖。
2025-04-05 21:36:26
867
原创 CoreCLR 计划阶段(PlanPhase2)-为普通Plug分配空间
上一篇文章中我们已经说了计划阶段会用到的两种数据结构——plug和brick。本文将从源码角度看一下Plug结构中各个字段的具体含义。到这里普通Plug的组织和为其寻找合适地址的处理应该就讲完整了。
2025-03-18 15:41:46
681
原创 CoreCLR 计划阶段(PlanPhase1)-Plug和 Brick块
接下来是最复杂的plan phase,不得不说gc.cpp文件真是长得很,3w多行,逻辑还绕,并且有得代码还没有作用(可能是历史遗留原因),gc_heap::plan_phase(int)这个函数翻来覆去看了好多遍,好了碎碎念完了。接下来要进行压缩或清扫来进行内存回收,然而如何决定要进行压缩或清扫呢?我们需要知道压缩或清扫哪个收益带来更大,如果堆中存在大量的内存碎片,压缩无疑是更好的。如果堆中仍有很多对象存活,那么我们只需要回收少部分死去对象的空间,这时候清扫效率更高。
2025-03-12 19:55:46
726
原创 CoreCLR 元数据加载(1) - DLL中的元数据存储
Net通过元数据和程序集的Manifest数据实现自我描述的特性,因为有了这些数据才能实现反射等功能。编译器在将C#等代码编译成DLL的同时,会将元数据存放在DLL的特定位置中。运行时在加载模块(Module)时通过这些元数据来获取类型信息、异常处理信息等。(累了,先这样吧)我们已经知道有哪些元数据表并且放在哪里了,接下来的问题是如何解析元数据表里面的内容。下个文章再说吧!拜拜。
2025-01-15 22:02:08
887
原创 CoreCLR mark phase源码分析
标记阶段(mark phase)作为GC的第一阶段,其主要作用是标记GC堆中分配出去的还在被引用的对象为存活,为后续的内存回收做准备。好了,到这里问题就解决了,从根对象开始,再依次标记根对象内的引用变量,就可以标记所有存活变量了。接下来的任务是CoreCLR用到的StackWakling技术,因为一个栈上的函数类型,可能有FCall、QCall以及CoreCLR本身的函数和IL编译成的函数,因此这部分会比较复杂。
2025-01-05 22:34:45
740
原创 CoreCLR 桩(Stub)的触发(2)
上一篇文章中描述了CLR中是如何通过precode来触发JIT的编译,这篇文章接着说JIT将IL代码编译机器码之后需要进行什么操作。这两篇文章说了CoreCLR中调用函数触发JIT编译以及编译之后的流程,通过这种方式来实现懒编译,即如果一个函数在程序里面不被调用,则不会被编译。若有错误请指正,有问题欢迎指出。
2024-10-14 21:57:58
989
4
原创 CoreCLR 虚函数调用源码
本文讲一下CoreCLR中虚函数的存储方式, 以及如何调用一个虚函数,推荐先看BoTR中关于MethodDesc的描述,对MethodTable的结构有一个了解。需要注意的是本文所描述的源码是CoreCLR8.0.1版本。与CLR2.0的虚函数表结构有较大的差别。
2024-10-13 01:47:24
618
1
原创 CoreCLR 桩(Stub)的触发(1)
本篇文章主要描述CoreCLR中是如何触发JIT的编译,已经编译之后的流程。注意,这篇文章不讲述JIT的编译过程,我们只需知道JIT输入的是IL代码,输出机器码就够了。
2024-10-01 22:41:41
762
原创 CoreCLR 分配小对象内存
在这篇文章中,描述了清扫(sweep)阶段如何回收未存活对象所占用的内存,这篇文章着重描述如何分配创建一个小对象(small object, 下文都叫小对象)所需要的内存,利用清扫阶段回收的内存。
2024-09-26 22:36:47
791
原创 CoreCLR Sweep阶段源码分析
Sweep(清扫,下文都叫这个名字)阶段发生在Plan Phase(计划)阶段之后,其主要作用就是将未被标记存活的物体所占的内存回收起来,并创建自由列表。如果空间足够大可以作为之后分配内存使用。此次分析代码所使用的CoreCLR版本为 8.0。
2024-09-23 22:04:27
1087
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人