条件自动回收

达到指定条件后自动执行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. 分布式一致性协议Raft,以及难搞的Paxos

    https://blog.csdn.net/colorant/article/details/73887706

  2. Spring boot + Vue axios 文件下载

    后端代码: @GetMapping("/{sn}") @ApiOperation(value = "获取文件",notes = "获取文件" ...

  3. Web开发底层是Servlet

    SpringMVC:是基于spring的一个框架,实际上就是spring的一个模块,专门是做web开发. 可以理解成servlet是一个升级 web开发底层是servlet,框架是在servlet基础 ...

  4. JVM专题2: JVM内存结构

    合集目录 JVM专题2: JVM内存结构 Java 内存分配 JVM 内存结构 The JVM is an abstract computing machine that enables a comp ...

  5. Flink源码学习笔记(2) 基于Yarn的自动伸缩容实现

    1.背景介绍 随着实时计算技术在之家内部的逐步推广,Flink 任务数及计算量都在持续增长,集群规模的也在逐步增大,本着降本提效的理念,我们研发了 Flink 任务伸缩容功能: 提供自动伸缩容功能,可 ...

  6. django入门 01 创建项目

    安装django库 pip install django 创建--by 终端 django-admin startproject myproject 通过命令创建的django项目,默认不含templ ...

  7. Basler相机启动问题xml读取出错

    切记!同一张网卡上多网口分别连多相机的时候,不要用同一个网段!!很容易出错!

  8. Java面试必问之线程池的创建使用、线程池的核心参数、线程池的底层工作原理

    一.前言 大家在面试过程中,必不可少的问题是线程池,小编也是在面试中被问啥傻了,JUC就了解的不多.加上做系统时,很少遇到,自己也是一知半解,最近看了尚硅谷阳哥的课,恍然大悟,特写此文章记录一下!如果 ...

  9. STL priority_queue 优先队列 小记

    今天做题发现一个很有趣的地方,竟然还是头一次发现,唉,还是太菜了. 做图论用STL里的priority_queue去优化prim,由于特殊需求,我需要记录生成树中是用的哪些边. 于是,我定义的优先队列 ...

  10. 使用CAShapeLayer做出圆形的进度条 —— #DF!

    CircleView.h的内容如下: #import <UIKit/UIKit.h> @interface CircleView : UIView @property (nonatomic ...