
CLR
文章平均质量分 88
clr
sinolover
完成项目,就要软硬兼施
展开
-
【转】.net框架读书笔记---CLR内存管理\垃圾收集(七)
编程控制垃圾收集器 System.GC类型为应用程序提供了直接控制垃圾收集器的一些方法,可以通过GC.MaxGeneration来查询托管堆支持的最大代龄,目前为2。 通过下面方法执行垃圾收集器 GC.Collect(int);传递代龄,传递0,收集0代,传递1,收集0,1代,传递2,收集0.1.2代; GC.Collect();无参强制对所有代龄的对象执行垃圾收集; GC.WaitForPendingFinalizers方法会挂起调用线程,直到处理终止化队列的线程清空了该队列,并完..原创 2021-01-12 14:14:46 · 191 阅读 · 0 评论 -
【转】.net框架读书笔记---CLR内存管理\垃圾收集(六)
对象代龄 代龄是旨在提高垃圾收集器性能的一种机制。有以下几点: 对象越新,其生存期越短; 对象越老,其生存期越长; 对托管堆的一部分执行垃圾收集要比对整个托管堆执行垃圾收集速度要快。 在托管堆初始化时,其中不包含任何对象。这时添加到托管堆中的对象被称为第0代对象。第0代对象就是新构造的对象,垃圾收集器还没有对他们执行过任何的检查,加入新启动一个应用程序托管堆,分配了5个对象(A到E),经过一段时间后,对象C和E将变为不可达对象。 当CLR初始化时,它会为第0代对象选择一个阈值,假定为2原创 2021-01-12 14:14:29 · 178 阅读 · 0 评论 -
【转】.net框架读书笔记---CLR内存管理\垃圾收集(五)
对象复苏 当一个终止化对象被认为死亡时,垃圾收集器可以强制使该对象获得重生(进入终止化可达队列),因为这样才能调用对象的Finalize方法。在Finalize方法被调用之后,它才算真正的死亡了,一个终止化对象会经历死亡,重生然后再死亡的过程。该现象被称为复苏(resurrection) 垃圾收集器将对象的引用放到终止化可达队列,对象可达,获得了重生; 调用对象的Finalize方法后,再没有任何根指向对象,对象真正的死亡。 在对象的Finalize方法中将其指针再放入全局静态变量中,会怎...原创 2021-01-12 14:14:22 · 166 阅读 · 0 评论 -
【转】.net框架读书笔记---CLR内存管理\垃圾收集(四)
弱引用 当一个根指向一个对象时,该对象不可能被垃圾收集器收集,在这种情况下,通常说存在一个该对象的强引用(strong reference)。垃圾收集器还支持弱引用(weak reference)的概念。弱引用允许垃圾收集器收集对象,同时也允许应用程序访问该对象,结果取决于时间。 如果对象的弱引用存在,那么在垃圾收集执行后,该对象的内存将被执行清理。另一方面,要访问一个弱引用对象,应用程序必须获取该对象的一个强引用。如果应用程序在对象被执行之前得到了它的强引用,那么垃圾收集器将不再对该对象执行垃原创 2021-01-12 14:14:18 · 170 阅读 · 0 评论 -
【转】.net框架读书笔记---CLR内存管理\垃圾收集(三)
接上一篇.net框架读书笔记---CLR内存管理\垃圾收集(二),主要学习了终止化对象(实现了Finalize方法的对象),了解了终止化对象的弊端,学习了通过实现IDisposable接口,通过Dispose方法来清理非托管资源,从而减轻垃圾收集器的压力,本节继续学习。 一、使用实现了Dispose模式的类型 System.IO.FileStream其基类Stream实现了IDisposable接口: classProgram { staticvoidMain(string[] args...原创 2021-01-12 14:14:11 · 196 阅读 · 0 评论 -
【转】.net框架读书笔记---CLR内存管理\垃圾收集(二)
前几天学习了CLR垃圾收集原理和基本算法,但是那些是仅仅相对于托管堆而言的,任何非托管资源的类型,例如文件、网络资源等,都必须支持一种称为终止化(finalization)的操作。 终止化 终止化操作允许一种资源在他所占的内存被回收之前首先执行一些清理工作。要提供终止化操作操作,必须为类型实现一个名为Finalize的方法。当垃圾收集器判定一个对象为可收集的垃圾时,它便会调用该对象的Finalize方法(如果存在的话)。 C#为定义Finalize方法提供了特殊的语法看下面代码; publi原创 2021-01-12 14:14:04 · 194 阅读 · 0 评论 -
【转】.net框架读书笔记---CLR内存管理\垃圾收集(一)
一、垃圾收集平台基本原理解析 在C#中程序访问一个资源需要以下步骤: 调用中间语言(IL)中的newobj指令,为表示某个特定资源的类型实例分配一定的内存空间。 初始化上一步所得的内存,设置资源的初始状态,从而使其可以为程序所用。一个类型的实例构造器负责这样的初始化工作。 通过访问类型成员来使用资源。 销毁资源状态,执行清理工作。 释放托管堆上面的内存,该步骤由垃圾收集器全权负责,值类型实例所占的内存位于当前运行线程的堆栈上,垃圾收集器并不负责这些资源的回收,当值类型实例变量所在的方法执行结原创 2021-01-12 13:41:43 · 207 阅读 · 0 评论 -
【转】C#技术漫谈之垃圾回收机制(GC)
摘要:今天我们漫谈C#中的垃圾回收机制,本文将从垃圾回收机制的原理讲起,希望对大家有所帮助。 GC的前世与今生 虽然本文是以.NET作为目标来讲述GC,但是GC的概念并非才诞生不久。早在1958年,由鼎鼎大名的图林奖得主John McCarthy所实现的Lisp语言就已经提供了GC的功能,这是GC的第一次出现。Lisp的程序员认为内存管理太重要了,所以不能由程序员自己来管理。 但后来的日子里Lisp却没有成气候,采用内存手动管理的语言占据了上风,以C为代表。出于同样的理由,不同的人却有不同原创 2021-01-13 09:52:29 · 214 阅读 · 1 评论 -
【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第六节 理解垃圾回收GC,提搞程序性能****
前言 虽然在.Net Framework 中我们不必考虑内在管理和垃圾回收(GC),但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC)。另外,了解内存管理可以帮助我们理解在每一个程序中定义的每一个变量是怎样工作的。 简介 这一节我们将介绍垃圾回收机制GC以及一些提搞程序性能的技巧。 绘图Graphing 让我们站在GC的角度研究一下。如果我们负责“扔垃圾”,我们需要制定一个有效的“扔垃圾”计划。显然,我们需要判断哪些是垃圾,哪些不是。 为了决定...原创 2021-01-13 09:50:53 · 242 阅读 · 0 评论 -
【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第五节 引用类型复制问题及用克隆接口ICloneable修复
前言 虽然在.Net Framework 中我们不必考虑内在管理和垃圾回收(GC),但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC)。另外,了解内存管理可以帮助我们理解在每一个程序中定义的每一个变量是怎样工作的。 简介 这一节我们将介绍引用类型变量在堆中存储时会产生的问题,同时介绍怎么样使用克隆接口ICloneable去修复这种问题。 复制不仅仅是复制 为了更清晰的阐述这个问题,让我们测试一下在堆中存储值类型变量和引用类型变量时会产生的不同情况。 ...原创 2021-01-12 14:15:41 · 201 阅读 · 0 评论 -
【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第四节 参数传递对堆栈的影响 2
前言 虽然在.Net Framework 中我们不必考虑内在管理和垃圾回收(GC),但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC)。另外,了解内存管理可以帮助我们理解在每一个程序中定义的每一个变量是怎样工作的。 简介 继续上篇未完成的“参数传递对堆栈的影响”。 引用类型传递 传递引用类型跟上一节所示例中用引用的方式传递值类型相似。 如果使用引用类型(原文可能笔误,写的是值类型): public class MyInt ...原创 2021-01-12 14:15:34 · 168 阅读 · 0 评论 -
【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第四节 参数传递对堆栈的影响 1
前言 虽然在.Net Framework 中我们不必考虑内在管理和垃圾回收(GC),但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC)。另外,了解内存管理可以帮助我们理解在每一个程序中定义的每一个变量是怎样工作的。 简介 这篇文章我们将介绍一些方法参数传递行为在堆与栈中的影响。前几节我们介绍了堆与栈的基本工作原理,程序执行时值类型与引用类型在堆栈中的存储。另外,我们已经介绍了一些关于指针的基本知识。这一节中参数传递对堆栈的影响很重要,下面会慢慢道来。 参数,大...原创 2021-01-12 14:15:26 · 199 阅读 · 0 评论 -
【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第三节 栈与堆,值类型与引用类型
前言 虽然在.Net Framework 中我们不必考虑内在管理和垃圾回收(GC),但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC)。另外,了解内存管理可以帮助我们理解在每一个程序中定义的每一个变量是怎样工作的。 简介 本文将介绍值类型与引用类型在堆栈里的基本存储原理。 值类型会存储在堆里? 是的,值类型有时候就是会存储在堆里。上一节中介绍的黄金规则2:值类型和指针永远存储在它们声明时所在的堆或栈里。如果一个值类型不是在方法中定义的,而...原创 2021-01-11 11:33:58 · 265 阅读 · 0 评论 -
【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理
栈基本工作原理 导航 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第三节 栈与堆,值类型与引用类型 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第四节 参数传递对堆栈的影响 1 深入浅出图解C#堆与栈 C# Heap(ing).原创 2021-01-11 11:33:00 · 263 阅读 · 0 评论 -
【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈
理解堆与栈 导航 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第三节 栈与堆,值类型与引用类型 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第四节 参数传递对堆栈的影响 1 深入浅出图解C#堆与栈 C# Heap(ing) V.原创 2021-01-11 11:09:40 · 278 阅读 · 0 评论 -
【转】关于CLR内存管理一些深层次的讨论[下篇]
《上篇》中我们主要讨论的是程序集(Assembly)和应用程序域(AppDomain)的话题,着重介绍了两个不同的程序集加载方式——独占方式和共享方式(中立域方式);以及基于进程范围内的字符串驻留。这篇将关注点放在托管对象创建时内存的分配和对大对象(LO:Large Object)的回收上,不对之处,还望各位能够及时指出。 目录 一、从类型(Type)与实例(Instance)谈起 二、实例内存分配不仅限于GC堆 三、实例对类型的引用 四、LOH中的对象如何被回收 一、从类型(Type)与实例(I.原创 2021-01-11 10:34:43 · 300 阅读 · 1 评论 -
【转】.NET Remoting
.Net Remoting提供了一种允许一个应用域中的对象与另一个应用域中的对象进行交互的框架。是.NET框架中的一个重要技术改进,它用于减轻运行应用程序的系统开销. 中文名 .Net Remoting 作用 减轻运行应用程序的系统开销 目录 1介绍 2.NET Remoting的原理 ▪1.NET Remoting的体系结构 ▪2..NET Remoting的扩展 3.NET Remoting的分布式应用 介绍 编辑 从结构上看,.NETRemoting对象非常适...原创 2021-01-11 09:25:41 · 329 阅读 · 0 评论 -
【转】关于CLR内存管理一些深层次的讨论[上篇]
半年之前,PM让我在部门内部进行一次关于“内存泄露”的专题分享,我为此准备了一份PPT。今天无意中将其翻出来,觉得里面提到的关于CLR下关于内存管理部分的内存还有点意思。为此,今天按照PPT的内容写了一篇文章。本篇文章不会再讨论我们熟悉的话题,比如“值类型、引用类型具有怎样的区别?”、“垃圾回收分为几个步骤?”、“Finalizer和Dispose有何不同”、等等。整篇文章分上下两篇,上篇主要谈论的是“程序集(Assembly)和应用程序域(AppDomain)”。也许有的地方说的不是很正确,希望读者不吝赐原创 2021-01-11 09:23:29 · 269 阅读 · 0 评论