条件自动回收

达到指定条件后自动执行GC回收垃圾。

GC中的方法AddMemoryPressure和RemoveMemoryPressure

本机资源有时会消耗大量内存,但用于包装它的托管对象只占用很少的内存。一个典型的例子就是位图。一个位图可能占用几兆字节的本机内存,托管对象却极小,只包含一个HBITMAP(一个4或8字节的值)。如果进程操作许多位图,进程的内存消耗将以一个恐怖的速度增长。为了修正这个问题,GC类提供了以下两个静态方法:

public static void AddMemoryPressure(Int64 bytesAllocated); // 增加bytesAllocated 大小的GC压力  将非托管内存的大小告诉GC。
public static void RemoveMemoryPressure(Int64 bytesAllocated);//释放bytesAllocated 大小GC压力 释放非托管资源。

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

有的本机资源的数量是固定的。例如,Windows以前就限制只能创建5个设备上下文。应用程序能打开的文件数量也必须有限制。如果这些本机资源的数量有限,那么一旦试图使用超过允许数量的资源,通常会导致抛出异常。为了解决这个问题,命名空间 了

using System.Runtime.ConstrainedExecution;
using System.Runtime.InteropServices; MemoryPressure(0);
MemoryPressure(10 * 1024 * 1024);//10MB 对象
Console.Read();
static void MemoryPressure(int size)
{
Console.WriteLine("创造一组对象,并且指定它的逻辑大小");
for (int i = 0; i < 15; i++)
{
new BigObject(size);
} } public class BigObject
{
private int Size = 0;
public BigObject(int size)
{
Size = size;
if (size > 0) GC.AddMemoryPressure(size);
Console.WriteLine("增加一个大对象");
} ~BigObject()
{
if (Size > 0) GC.RemoveMemoryPressure(Size);
Console.WriteLine("移除一个大对象");
}
}

HandleCollector类

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

  这个类有计数器的功能,当超过给定的初始值时,垃圾回收器就强制执行垃圾回收。具体用法 是将非托管句柄封装到托管对象A中,在托管对象A启用一个HandleCollector计数器,当创建的托管句柄达到一定数量触发GC。
如果一个类要包装数量有限制的本机资源,就应该使用该类的实例来提示垃圾回收器实际要使用资源的多少个实例。该类的对象会在内部监视这个计数,计数太大就强制垃圾回收。
跟踪未完成的句柄,并在达到指定阈值时强制进行垃圾收集。通常,非托管资源包括hdc、HWnds等的句柄。

构造函数

HandleCollector(String, Int32)使用名称和开始句柄收集的阈值初始化HandleCollector类的一个新实例。

HandleCollector(String, Int32, Int32)使用名称、开始句柄收集的阈值和句柄收集必须发生的阈值初始化HandleCollector类的新实例

属性
    Count
    InitialThreshold
    MaximumThreshold
    Name
方法
    Add 增加当前句柄计数。
    Remove 移除当前句柄计数。

using System.Runtime.ConstrainedExecution;
using System.Runtime.InteropServices; HandlecollectorDemo();
static void HandlecollectorDemo( )
{
Console.WriteLine("HandlecollectorDem");
for (int i = 0; i < 15; i++)
{
new LimitResource();
} } public class LimitResource
{
private static readonly HandleCollector HC = new ("LimitResource", 2);
public LimitResource()
{
HC.Add(); Console.WriteLine($"增加一个LimitResource {HC.Count}");
} ~LimitResource()
{
HC.Remove();
Console.WriteLine($"减少一个LimitResource {HC.Count}"); }
}

【C# .Net GC】条件自动垃圾回收 HandleCollector类的更多相关文章

  1. Java基础知识强化83:System类之gc()方法(垃圾回收)以及和finalize()区别

    1. System概述: System类包含一些有用的类字段和方法.它不能被实例化. 2. gc()方法:垃圾回收器 public static void gc()       调用gc方法暗示着Ja ...

  2. 2.5 – Garbage Collection 自动垃圾回收 Stop-the-world vs. incremental vs. concurrent 垃圾回收策略

    2.5 – Garbage Collection  自动垃圾回收 Lua 5.3 Reference Manual http://www.lua.org/manual/5.3/manual.html# ...

  3. JavaScript具有自动垃圾回收机制

    JavaScript具有自动垃圾回收机制 原理: 找出那些不再继续使用的变量,然后释放其占用的内存.   正常的生命周期:     局部变量指在函数执行的过程中存在.而在这个过程中,会为局部变量在栈或 ...

  4. java有自动垃圾回收机制

    当垃圾收集器判断已经没有任何引用指向对象的时候,会调用对象的finalize方法来释放对象占据的内存空间~ java中垃圾回收以前听老师讲好像是内存满了他才去做一次整体垃圾回收,在回收垃圾的同时会调用 ...

  5. .Net平台GC VS JVM垃圾回收

    前言 不知道你平时是否关注程序内存使用情况,我是关注的比较少,正好借着优化本地一个程序的空对比了一下.Net平台垃圾回收和jvm垃圾回收,顺便用dotMemory看了程序运行后的内存快照,生成内存快照 ...

  6. JVM原理三-----GC模块,垃圾回收

    GC方法:在JVM启动时填入参数(比如:-XX:+UseConcMarkSweepGC ) 算法区分: 1.古老回收算法: Reference Counting  ,对象有一个引用,即增加一个计数,删 ...

  7. 动图图解GC算法 - 让垃圾回收动起来!

    原创:码农参上(微信公众号ID:CODER_SANJYOU),欢迎分享,转载请保留出处. 提到Java中的垃圾回收,我相信很多小伙伴和我一样,第一反应就是面试必问了,你要是没背过点GC算法.收集器什么 ...

  8. 【C# .Net GC】强制垃圾回收 和System GC

    属性 GC.MaxGeneration:获取系统当前支持的最大代数. 方法 GC.GetTotalMemory(bool forceFullCollection) 方法  true表示该方法先做垃圾收 ...

  9. 【C# .Net GC】后台垃圾回收

    在后台垃圾回收 (GC) 中,在进行第 2 代回收的过程中,将会根据需要收集暂时代(第 0 代和第 1 代). 后台垃圾回收是在一个或多个专用线程上执行的,具体取决于它是后台还是服务器 GC,它只适用 ...

随机推荐

  1. nginx的fastcgi配置

    首先参考了一份配置注释(来自"小刚的博客"): #运行用户 user www-data; #启动进程,通常设置成和cpu的数量相等 worker_processes 1; #全局错 ...

  2. vue学习13-自定义组件

    1 <!DOCTYPE html> 2 <html lang='en'> 3 <head> 4 <meta charset='UTF-8'> 5 < ...

  3. eclipse不能创建web项目,如何设置(亲测可用)

    具体描述:就是在项目右键或者file-->new的时候没有dynamic web project选项)(我这里已经解决.所以看得到) 根本原因:就是有没有web的开发插件 两种办法 1.下载使用 ...

  4. gin框架中全局跨域请求处理设置

    跨域访问的问题 OPTIONS请求 全局跨域访问中间件 // 跨域访问:cross origin resource share func Cors() gin.HandlerFunc { return ...

  5. vue 项目npm run dev ip访问

    webpack npm run dev 不能通过ip访问 只能通过localhost访问 解决方法如下: 修改vue-cli: config/index.js 文件 把文件中 host 的值,改成 i ...

  6. 不难懂------git开发过程中流程

    001.创建仓库 002.新建项目 003.初始化仓库  这一步不需要做 git init : 文件夹中会多出一个隐藏的.git文件 004.克隆项目 git clone <项目地址> 0 ...

  7. PaperRead - A Shader Framework for Rapid Prototyping of GPU-Based Volume Rendering

    PaperRead - A Shader Framework for Rapid Prototyping of GPU-Based Volume Rendering 目录 PaperRead - A ...

  8. python网络爬虫-入门(一)

    前言 1.爬虫程序是Dt(Data Technology,数据技术)收集信息的基础,爬取到目标网站的资料后,就可以分析和建立应用了. 2.python是一个简单.有效的语言,爬虫所需要的获取.存储.整 ...

  9. NumPy 数组学习手册·翻译完成

    原文:Learning NumPy Array 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远. 在线阅读 ApacheCN 面试求职交流群 ...

  10. jsp中<%@ taglib prefix="s" uri="/struts-tags"%>标签意思

    @taglib表明引用标签.类似java中的import语句prefix="s" 引用的名称在页面可以使用,就像java中生成的一个对象名,以后调用的时候直接使用<s:xxx ...