第十一节:用于本地资源的其它垃圾回收功能

有时,本地资源会消耗大量的内存,但是用于包装该资源的托管对象只占用了非常少的内存。一个典型的例子就是位图。一个位图可能占用几兆字节的本地内存,但是托管对象却极小,因为它只包含了一个hbitmap(一个4或8字节的值),从CLR角度看,一个进程可以在执行一次垃圾回收之前分配数百个位图(他们用的托管内存太少了)。但是,如果进程操作许多位图,进程的内存消耗将以一个恐怖的速度增长。为了修正这个问题,GC类提供了以下两个静态方法:

public static void AddMemoryPressure(long bytesAllocated);

public static void RemoveMemoryPressure(long bytesAllocated);

如果一个类要包装可能很大的本地资源,就应该使用这些方法提示垃圾回收器实际需要消耗多少内存。垃圾回收器内部会监视内存压力,压力变大时,就会强制执行垃圾回收。

有的本地资源的数量是固定的。例如:Window以前就限制它只能创建5个设备上下文。应用程序能打开的文件数量也必须有限制。同样的,从CLR的角度看,一个进程可以在执行垃圾回收之前分配数百个对象(每个对象都使用了极少的内存)。但是,如果这些本地资源的数量有限,那么一旦超过允许数量的资源,通常会导致抛出异常。为了解决这个异常,.NET提供了如下类:

// 摘要:

//     跟踪未处理的句柄,并在达到指定阈值时强制执行垃圾回收。

public sealed class HandleCollector

{

// 摘要:

//     使用一个名称以及一个阈值(在达到该值时开始执行句柄回收)初始化 System.Runtime.InteropServices.HandleCollector

//     类的新实例。

//

// 参数:

//   name:

//     回收器的名称。此参数允许您为跟踪句柄类型的回收器分别命名。

//

//   initialThreshold:

//     指定何时开始执行回收的值。

//

// 异常:

//   System.ArgumentOutOfRangeException:

//     initialThreshold 参数小于 0。

[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]

public HandleCollector(string name, int initialThreshold);

//

// 摘要:

//     使用一个名称、一个指定何时开始执行句柄回收的阈值,以及一个指定必须进行句柄回收的阈值初始化 System.Runtime.InteropServices.HandleCollector

//     类的新实例。

//

// 参数:

//   name:

//     回收器的名称。此参数允许您为跟踪句柄类型的回收器分别命名。

//

//   initialThreshold:

//     指定何时开始执行回收的值。

//

//   maximumThreshold:

//     指定必须开始进行回收的值。此值应设置为可用句柄的最大数量。

//

// 异常:

//   System.ArgumentOutOfRangeException:

//     initialThreshold 参数小于 0。- 或 -maximumThreshold 参数小于 0。

//

//   System.ArgumentException:

//     maximumThreshold 参数小于 initialThreshold 参数。

public HandleCollector(string name, int initialThreshold, int maximumThreshold);

// 摘要:

//     获取回收的句柄的数量。

//

// 返回结果:

//     回收的句柄的数量。

public int Count { get; }

//

// 摘要:

//     获取一个值,该值指定了何时开始执行回收。

//

// 返回结果:

//     指定何时开始执行回收的值。

public int InitialThreshold { get; }

//

// 摘要:

//     获取指定必须开始进行回收的值。

//

// 返回结果:

//     指定必须开始进行回收的值。

public int MaximumThreshold { get; }

//

// 摘要:

//     获取 System.Runtime.InteropServices.HandleCollector 对象的名称。

//

// 返回结果:

//     此 System.Runtime.InteropServices.HandleCollector.Name 属性允许您为跟踪句柄类型的回收器分别命名。

public string Name { get; }

// 摘要:

//     增加当前句柄计数。

//

// 异常:

//   System.InvalidOperationException:

//     System.Runtime.InteropServices.HandleCollector.Count 属性小于 0。

public void Add();

//

// 摘要:

//     减少当前句柄计数。

//

// 异常:

//   System.InvalidOperationException:

//     System.Runtime.InteropServices.HandleCollector.Count 属性小于 0。

public void Remove();

}

如果一个类包装数量有限的本地资源,就应该使用这个类的一个实例来提示垃圾回收器它实际需要消耗资源的多少个实例。该类的对象会在内部监视这个计数,当计数变大时,就强制执行垃圾回收。

注意:在内部,GC. AddMemoryPressure和HandleCollector.Add方法会调用GC.Collect方法,强迫垃圾回收再第0代达到预算前启动。一般都强烈反对强制开启一次垃圾回收,因为它对应用程序的性能造成负面影响。但是,类之所以调用这个方法,目的是保证应用程序能用到有限的本地资源。本地资源消耗用光了,应用程序就会失败。对于大多数应用程序,性能受到一些损失总好过与完全无法运行。

时间: 2024-12-28 20:12:26

第十一节:用于本地资源的其它垃圾回收功能的相关文章

谷歌浏览器报错:跨域问题处理( Access-Control-Allow-Origin)_ 用于本地测试的快捷解决方法

报错提示如下: XMLHttpRequest cannot load http://www.xxxx.com/264/Data/GetScreenInfo. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. 今天需要做一个本地测试,html中的js效果涉及跨域拉取数据的问题,Chrome报错并拒绝数

centos mysql 优化 第二十一节课

centos mysql  优化  第二十一节课 f

第三百七十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现我的搜索以及热门搜索

第三百七十一节,Python分布式爬虫打造搜索引擎Scrapy精讲-elasticsearch(搜索引擎)用Django实现我的搜索以及热门 我的搜素简单实现原理我们可以用js来实现,首先用js获取到输入的搜索词设置一个数组里存放搜素词,判断搜索词在数组里是否存在如果存在删除原来的词,重新将新词放在数组最前面如果不存在直接将新词放在数组最前面即可,然后循环数组显示结果即可 热门搜索实现原理,当用户搜索一个词时,可以保存到数据库,然后记录搜索次数,利用redis缓存搜索次数最到的词,过一段时间更新

centos mysql 优化 第十一节课

centos mysql  优化  第十一节课 f

火云开发课堂 - 《使用Cocos2d-x 开发3D游戏》系列 第二十一节:地表漫游与寻路

<使用Cocos2d-x 开发3D游戏>系列在线课程 第二十一节:地表漫游与寻路 视频地址:http://edu.csdn.net/course/detail/1330/20822?auto_start=1 交流论坛:http://www.firestonegames.com/bbs/forum.php 工程下载地址:请成为正式学员获取工程 课程截图: ?? 版权声明:本文为博主原创文章,未经博主允许不得转载.

本地向服务器上传文件的方式-本地资源映射到服务器

本地向服务器传文件一定使不少刚接触服务器端工作的人疑惑,笔者研究生期间参与维护学校科技部的ASP.NET的IIS服务器,服务器上没有安装FTP工具,为了安全考虑网络也没有打开,windows自带的FTP服务也没有打开的情况下,远程连接时使用本地磁盘映射方法很方便实现本地与服务器的交互. 下面介绍两种方式交互(本地主机win10,远程win2003): 本地磁盘映射到服务器方式的步骤: 1 win + R 输入mstsc指令,打开远程桌面,输入ip 2点击显示选项 点击本地资源>详细信息 选择磁盘

centos LAMP第三部分php,mysql配置 第二十一节课

centos   LAMP第三部分php,mysql配置   第二十一节课 上半节课 下半节课 f

第三百二十一节,Django框架,发送邮件

第三百二十一节,Django框架,发送邮件 全局配置settings.py EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' #发送邮件引擎 EMAIL_USE_TLS = False #是否以https方式 EMAIL_HOST = 'smtp.163.com' #邮件smtp服务器 EMAIL_PORT = 25 #端口 EMAIL_HOST_USER = '[email protected]' #发件人 EMAIL_

第二百四十一节,Bootstrap进度条媒体对象和 Well 组件

第二百四十一节,Bootstrap进度条媒体对象和 Well 组件 学习要点: 1.Well 组件 2.进度条组件 3.媒体对象组件 本节课我们主要学习一下 Bootstrap 的三个组件功能:Well 组件.进度条组件.媒体对 象组件. 一.Well 组件 这个组件可以实现简单的嵌入效果. 嵌入效果 well样式class类,写在<div>里,设置一个div区块嵌入效果(Bootstrap)well-lg样式class类,写在<div>里,设置一个div区块嵌入效果大尺寸(Boo