`
zealotds
  • 浏览: 122782 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

.net CLR GC 基础和算法摘记

    博客分类:
  • .net
阅读更多
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统计分析器源码"是一个宝贵的开发工具,它提供了一种可视化和理解.NET应用程序底层行为的方式。通过深入分析和理解这些统计信息,开发者可以更有效地提升应用性能,解决潜在问题,并增强对...

    .NET CLR via C#(第4版) 最新完整版 高清文字版

    本书针对clr、C#5.0和.net framework 4.5进行深入、全面的探讨,并结合实例介绍了如何利用它们进行设计、开发和调试。 本书深入、全面探讨.NET Framework、CRL和多核编程,广泛讨论FrameworkClassLibrary(FCL)核心...

    C++.NET CLR

    C++.NET CLR,全称是C++针对.NET公共语言运行时(Common Language Runtime,CLR),是一种结合了传统C++编程语言特性和微软.NET框架技术的编程环境。它允许开发者使用C++语法来创建托管代码,这使得C++程序员能够...

    .NET CLR Injection_.NETCLRInjection_

    压缩包内的 ".NET CLR Injection" 文件可能是包含了实现这些功能的源代码和相关文档。通过学习和使用这些资源,开发者可以掌握.NET CLR注入技术,并在自己的项目中实现类似的功能。然而,需要注意的是,不恰当的使用...

    SuperMap Objects .NET CLR框架下快速入门

    在当今的GIS(地理信息系统)开发领域,SuperMap Objects .NET是一个非常重要的组件库,它为开发者提供了在.NET CLR(Common Language Runtime)框架下进行地图处理、空间分析和地理数据管理的强大工具。本指南将...

    .NET CLR Injection 运行时修改IL .NET HOOK

    .NET CLR (Common Language Runtime) 注入和IL (Intermediate Language) .NET Hook是两种高级的编程技术,主要用于在.NET环境中实现动态代码修改和控制程序行为。本文将深入探讨这两种技术及其应用。 首先,让我们...

    深入.NET CLR编程系列视频教程,值得参考

    9. **安全性**:探讨.NET的安全模型,如代码访问安全、角色基础的安全性和策略配置。 10. **托管代码与非托管代码交互**:讲解如何通过PInvoke和COM Interop在托管代码和非托管代码之间建立桥梁。 11. **元数据和...

    .NET CLR via C#(第4版).part2.rar

    因为大小限制,这里分成3个文件处理,稍后会更新描述 备注好 3个 链接地址 需要三个全部下载才可以解压完成 (推荐资源搜索) 文件名为: 《.NET CLR via C#(第4版).part1....《.NET CLR via C#(第4版).part3.rar》 45M

    .NET CLR via C#(第4版).part1.rar

    因为大小限制,这里分成3个文件处理,稍后会更新描述 备注好 3个 链接地址 需要三个全部下载才可以解压完成 (推荐资源搜索) 文件名为: 《.NET CLR via C#(第4版).part1....《.NET CLR via C#(第4版).part3.rar》 45M

    .NET CLR via C#(第4版).part3.rar

    因为大小限制,这里分成3个文件处理,稍后会更新描述 备注好 3个 链接地址 需要三个全部下载才可以解压完成 (推荐资源搜索) 文件名为: 《.NET CLR via C#(第4版).part1....《.NET CLR via C#(第4版).part3.rar》 45M

    .NET CLR via C#(第4版) 文件名及其链接

    .NET CLR via C#(第4版) CSDN 下载文件名及其链接作为专辑的说明文件存在。

    在Java 虚拟机与.NET CLR运行时进行交互集成的程序代码例子

    在跨平台的软件开发中,有时我们需要在Java和.NET Framework之间进行交互,这通常是通过Java Native Interface (JNI) 和 Common Language Runtime (CLR) 的互操作性实现的。本篇文章将详细探讨如何在Java虚拟机(JVM...

    Design and Implementation of Generics for the .NET CLR

    本文档由微软研究院的Andrew Kennedy和Don Syme撰写,详细介绍了.NET Common Language Runtime(CLR)中泛型特性的设计与实现过程。CLR作为.NET框架的核心组成部分,提供了一个共享类型系统、中间语言以及动态执行...

    .NET CLR via C#(第4版)中文 part5

    中文第四版 ...CLR是.NET Framework的核心,《CLR via C#》使你穿云破雾,直抵核心,以窥堂奥。知其然,只能说是才入门,只有知其所以然,“登堂入室”,才能达至“不为浮云遮望眼,只缘身在此山中”的境界。

    .NET CLR via C#(第4版)中文 part3(3-5)

    中文第四版 ...CLR是.NET Framework的核心,《CLR via C#》使你穿云破雾,直抵核心,以窥堂奥。知其然,只能说是才入门,只有知其所以然,“登堂入室”,才能达至“不为浮云遮望眼,只缘身在此山中”的境界。

    .NET CLR via C#(第4版)中文part1(5部分)(1-5)

    中文第四版 ...CLR是.NET Framework的核心,《CLR via C#》使你穿云破雾,直抵核心,以窥堂奥。知其然,只能说是才入门,只有知其所以然,“登堂入室”,才能达至“不为浮云遮望眼,只缘身在此山中”的境界。

    .NET CLR via C#(第4版)中文 part2(2-5)

    中文第四版 ...CLR是.NET Framework的核心,《CLR via C#》使你穿云破雾,直抵核心,以窥堂奥。知其然,只能说是才入门,只有知其所以然,“登堂入室”,才能达至“不为浮云遮望眼,只缘身在此山中”的境界。

    .NET CLR via C#(第4版)中文 part-4(4-5)

    中文第四版 ...CLR是.NET Framework的核心,《CLR via C#》使你穿云破雾,直抵核心,以窥堂奥。知其然,只能说是才入门,只有知其所以然,“登堂入室”,才能达至“不为浮云遮望眼,只缘身在此山中”的境界。

    .NET CLR via C#(第4版)

    CSDN 下载文件名及其链接作为专辑的封面文件,可自行决定是否下载。

    CLRProfiler 内存泄漏工具 .net

    CLRProfiler是.NET Framework中用于...总之,了解和使用CLRProfiler对于任何.NET开发者来说都是提高应用程序性能和稳定性的关键技能。通过深入理解内存管理,开发者能更好地控制资源,避免因内存泄漏引发的各类问题。

Global site tag (gtag.js) - Google Analytics