tag: clr gc
本系列为CRL via C#的节选
newobj(IL)的步骤
- 计算类型及其基类所有字段所需要的字节总数
- 在前边字节的基础上加上两个开销数量:类型对象指针(4Byte),同步索引块(4Byte)。
- CLR检查物理内存是否足够。如果足够,则新对象被放置在NewObjPtr所指的托管堆位置.接着构造器被调用(NewObjPtr被传递给this)。NewObjPtr指向下一处可用内存。newobj指令返回新对象地址。
CLR与C运行时内存分配的对比:
- C运行时操作链表,查找足够大的内存块并返回,之后修改链表。连续分配对象的内存可能不连续。
- CLR的内存分配则只是简单的地址加新对象的偏移量,效率极高,甚至堪比线程堆栈。连续分配对象的内存连续。
连续内存的优势:
- 进程的工作集相对较小
- 方法中使用的对象也更可能同时在CPU缓存中驻留
其它一些说明:
- GC保证了托管堆的内存无限的假设。
- new操作符通过检查NewObjPtr+Offset是否超界来触发GC(基于上边的简单模型)。
- GC只有在第0代对象充满时才会触发。
- GC有相当的性能开销。
GC算法:
- 根:程序中的一个存储位置,包含了一个指向引用类型对象的(托管堆)内存地址。可以是static字段、方法参数或局部变量。注意,只有引用类型的变量才是根,值类型变量不是。
- GC不会手机根所指向的对象(存在引用)。
- GC可以遍历线程调用栈,检查每个方法的内部表来确定方法内部的根。
- GC在所有类型对象中迭代执行以得到静态字段的根组。
- GC开始执行时,假设各个对象都可以收集(没有标记)。
- 之后,GC开始标记(marking)操作:如果发现根引用了一个对象,就在该对象的同步块索引字段上标记一位(可能递归根所引用的对象,如果存在的话)。
- 继续标记下一个根,如果已经被标记,则停止次根的标记活动(提高效率并避免环)
- 线性遍历垃圾(未被标记的)内存块,直到找到较大的连续内存块,则把之前的非垃圾对象搬移到该地址以压缩托管堆。
- 搬移对象需要修改指向原对象地址的CPU寄存器内容。
- 使NewObjPtr指向最后一个非垃圾对象之后。
基于以上理论,GC需要能够识别程序中的根,而且能找到所有对象的指针。CLR托管堆总能够知道对象的实际类型,从而使用metadata判断对象的哪些成员引用着其它的对象。由于C++可以对指针进行任意转型,因此就无法知道指针所引用对象的确切类型,继而无法GC。
分享到:
相关推荐
总的来说,"微软.NET CLR统计分析器源码"是一个宝贵的开发工具,它提供了一种可视化和理解.NET应用程序底层行为的方式。通过深入分析和理解这些统计信息,开发者可以更有效地提升应用性能,解决潜在问题,并增强对...
本书针对clr、C#5.0和.net framework 4.5进行深入、全面的探讨,并结合实例介绍了如何利用它们进行设计、开发和调试。 本书深入、全面探讨.NET Framework、CRL和多核编程,广泛讨论FrameworkClassLibrary(FCL)核心...
C++.NET CLR,全称是C++针对.NET公共语言运行时(Common Language Runtime,CLR),是一种结合了传统C++编程语言特性和微软.NET框架技术的编程环境。它允许开发者使用C++语法来创建托管代码,这使得C++程序员能够...
压缩包内的 ".NET CLR Injection" 文件可能是包含了实现这些功能的源代码和相关文档。通过学习和使用这些资源,开发者可以掌握.NET CLR注入技术,并在自己的项目中实现类似的功能。然而,需要注意的是,不恰当的使用...
在当今的GIS(地理信息系统)开发领域,SuperMap Objects .NET是一个非常重要的组件库,它为开发者提供了在.NET CLR(Common Language Runtime)框架下进行地图处理、空间分析和地理数据管理的强大工具。本指南将...
.NET CLR (Common Language Runtime) 注入和IL (Intermediate Language) .NET Hook是两种高级的编程技术,主要用于在.NET环境中实现动态代码修改和控制程序行为。本文将深入探讨这两种技术及其应用。 首先,让我们...
9. **安全性**:探讨.NET的安全模型,如代码访问安全、角色基础的安全性和策略配置。 10. **托管代码与非托管代码交互**:讲解如何通过PInvoke和COM Interop在托管代码和非托管代码之间建立桥梁。 11. **元数据和...
因为大小限制,这里分成3个文件处理,稍后会更新描述 备注好 3个 链接地址 需要三个全部下载才可以解压完成 (推荐资源搜索) 文件名为: 《.NET CLR via C#(第4版).part1....《.NET CLR via C#(第4版).part3.rar》 45M
因为大小限制,这里分成3个文件处理,稍后会更新描述 备注好 3个 链接地址 需要三个全部下载才可以解压完成 (推荐资源搜索) 文件名为: 《.NET CLR via C#(第4版).part1....《.NET CLR via C#(第4版).part3.rar》 45M
因为大小限制,这里分成3个文件处理,稍后会更新描述 备注好 3个 链接地址 需要三个全部下载才可以解压完成 (推荐资源搜索) 文件名为: 《.NET CLR via C#(第4版).part1....《.NET CLR via C#(第4版).part3.rar》 45M
.NET CLR via C#(第4版) CSDN 下载文件名及其链接作为专辑的说明文件存在。
在跨平台的软件开发中,有时我们需要在Java和.NET Framework之间进行交互,这通常是通过Java Native Interface (JNI) 和 Common Language Runtime (CLR) 的互操作性实现的。本篇文章将详细探讨如何在Java虚拟机(JVM...
本文档由微软研究院的Andrew Kennedy和Don Syme撰写,详细介绍了.NET Common Language Runtime(CLR)中泛型特性的设计与实现过程。CLR作为.NET框架的核心组成部分,提供了一个共享类型系统、中间语言以及动态执行...
中文第四版 ...CLR是.NET Framework的核心,《CLR via C#》使你穿云破雾,直抵核心,以窥堂奥。知其然,只能说是才入门,只有知其所以然,“登堂入室”,才能达至“不为浮云遮望眼,只缘身在此山中”的境界。
中文第四版 ...CLR是.NET Framework的核心,《CLR via C#》使你穿云破雾,直抵核心,以窥堂奥。知其然,只能说是才入门,只有知其所以然,“登堂入室”,才能达至“不为浮云遮望眼,只缘身在此山中”的境界。
中文第四版 ...CLR是.NET Framework的核心,《CLR via C#》使你穿云破雾,直抵核心,以窥堂奥。知其然,只能说是才入门,只有知其所以然,“登堂入室”,才能达至“不为浮云遮望眼,只缘身在此山中”的境界。
中文第四版 ...CLR是.NET Framework的核心,《CLR via C#》使你穿云破雾,直抵核心,以窥堂奥。知其然,只能说是才入门,只有知其所以然,“登堂入室”,才能达至“不为浮云遮望眼,只缘身在此山中”的境界。
中文第四版 ...CLR是.NET Framework的核心,《CLR via C#》使你穿云破雾,直抵核心,以窥堂奥。知其然,只能说是才入门,只有知其所以然,“登堂入室”,才能达至“不为浮云遮望眼,只缘身在此山中”的境界。
CSDN 下载文件名及其链接作为专辑的封面文件,可自行决定是否下载。
CLRProfiler是.NET Framework中用于...总之,了解和使用CLRProfiler对于任何.NET开发者来说都是提高应用程序性能和稳定性的关键技能。通过深入理解内存管理,开发者能更好地控制资源,避免因内存泄漏引发的各类问题。