.net GC知识点滴

简介: 垃圾回收算法:     托管堆:CLR要求的资源从托管堆分配,任何对象只要没有应用程序的根引用它,都会在某个时刻被垃圾回收器回收     基于代的机制,提高回收的性能,在程序的生命期中,新建的对象是新一代,而创建的比较早的对象是老一代,第0代是最近分配的对象,CLR 使用了0,1,2三代进行管理 GC和调试 GcAndDebug.cs (例子代码) 本地资源 终结(finalization)是CLR提供的一种机制,允许对象在垃圾回收器回收其内存之前执行一些得体的清理工作,任何包装了本地资源的类型都必须支持终结操作(实现一个命名为Finalize的方法)。

垃圾回收算法:


    托管堆:CLR要求的资源从托管堆分配,任何对象只要没有应用程序的根引用它,都会在某个时刻被垃圾回收器回收
    基于代的机制,提高回收的性能,在程序的生命期中,新建的对象是新一代,而创建的比较早的对象是老一代,第0代是最近分配的对象,CLR 使用了0,1,2三代进行管理

GC和调试

GcAndDebug.cs (例子代码)

本地资源


终结(finalization)是CLR提供的一种机制,允许对象在垃圾回收器回收其内存之前执行一些得体的清理工作,任何包装了本地资源的类型都必须支持终结操作(实现一个命名为Finalize的方法)。
GC判断一个对象是垃圾时,会调用对象的Finalize(实现的情况下),C#中使用~ClassName表示Finalize
In most cases, you do not need to write classes that derive from the CriticalFinalizerObject class. The .NET Framework class library provides two classes, SafeHandle and CriticalHandle, that provide critical finalization functionality for handle resources. Furthermore, the .NET Framework provides a set of prewritten classes derived from the SafeHandle class, and this set is located in the Microsoft.Win32.SafeHandles namespace. These classes are designed to provide common functionality for supporting file and operating system handles.

System.Runtime.ConstrainedExecution 下的 CriticalFinalizerObject 抽象对象,CLR特殊对待
System.Runtime.InteropServices下的派生抽象类
    SafeHandle
    CriticalHandle 和SafeHandle只是引用计数的区别
Microsoft.Win32.SafeHandles
    SafeFileHandle,SafeRegistryHandle ,SafeWaitHandle...
    SafeProcessHandle SafeLibraryHandle SafeLocalMemHandle SafeThreadHandle等MSDN没有编写,但同样是处理这个问题的
    类似的实现的不同类代表不同的资源类型,这么多的类似,主要是为了类型安全
SafeHandle的作用:
1、以前的IntPtr形式不够健壮,如在IntPtr赋值前可能抛出ThreadAbortException异常,这样托管代码将造成本地资源的泄露
2、防止利用潜在的安全漏洞,一个线程访问一个本地资源,另一个线程释放该资源,通过引用计数实现

对托管资源只有在极少数情况下才使用终结器

终结器被调用的时刻:
1、第0代满:
2、显式调用GC.Collect
3、Windows报告内存不足
4、CLR卸载AppDomain
5、CLR关闭

内部实现使用终结列表保留对象,通过这个GC进行处理, freachable队列

Dispose


终结器的调用时间由GC确定,调用者无法显式调用它
Dispose提供了显式清理资源的能力

GCHandle WeakReference

System.Runtime.CompilerServices.ConditionalWeakTable<TKey,TValue>
加入时的是对象的WeakReference,因此可能会回收,但可以确保只要key存在,value也是存在的

任何大于85000字节的对象被自动认为是大对象,大对象在大对象堆中分配

大量资源


GC
public static void AddMemoryPressure(Int64 bytesAllocated);  
public static void RemoveMemoryPressure(Int64 bytesAllocated);
提示GC实际需要消耗的内存,然后GC监视内存压力,压力变大时,强制回收

System.Runtime.InteropServices  HandleCollector 数量有限的本地资源

MemoryFailPoint在需要大量内存前可以先检查是否可以使用这么大的内存

GC的监视
代码形式:
    GC.GetTotalMemory
    GC.CollectionCount

详细参考CLR Via C#

例子代码下载: http://cid-56b433ad3d1871e3.office.live.com/self.aspx/.Public/GCDemo.rar

相关文章
|
存储 开发框架 Java
【CLR C#】浅谈.Net的GC(垃圾回收)机制及其整体流程
在.NET程序开发中,为了将开发人员从繁琐的内存管理中解脱出来,将更多的精力花费在业务逻辑上,CLR提供了自动执行垃圾回收的机制来进行内存管理,开发人员甚至感觉不到这一过程的存在。.NET程序可以找出某个时间点上哪些已分配的内存空间没有被程序使用,并自动释放它们。自动找出并释放不再使用的内存空间机制,就称为垃圾回收机制。本文主要介绍.Net中的GC(垃圾回收)机制及其整体流程。
【CLR C#】浅谈.Net的GC(垃圾回收)机制及其整体流程
|
存储 开发框架 安全
浅入.NETCore中的内存和GC知识
浅入.NETCore中的内存和GC知识
529 0
浅入.NETCore中的内存和GC知识
|
Java .NET C#
.NET面试题解析(06)-GC与内存管理
转自:http://www.cnblogs.com/anding/p/5260319.html   常见面试题目: 1. 简述一下一个引用对象的生命周期? 2. 创建下面对象实例,需要申请多少内存空间? public class User { public int Age { get; ...
2002 0
|
3月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
38 0
|
30天前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界
28 0
|
30天前
mvc.net分页查询案例——mvc-paper.css
mvc.net分页查询案例——mvc-paper.css
5 0
|
1月前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
95 5