【C# .Net GC】条件自动垃圾回收 HandleCollector类
条件自动回收
达到指定条件后自动执行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类的更多相关文章
- Java基础知识强化83:System类之gc()方法(垃圾回收)以及和finalize()区别
1. System概述: System类包含一些有用的类字段和方法.它不能被实例化. 2. gc()方法:垃圾回收器 public static void gc() 调用gc方法暗示着Ja ...
- 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# ...
- JavaScript具有自动垃圾回收机制
JavaScript具有自动垃圾回收机制 原理: 找出那些不再继续使用的变量,然后释放其占用的内存. 正常的生命周期: 局部变量指在函数执行的过程中存在.而在这个过程中,会为局部变量在栈或 ...
- java有自动垃圾回收机制
当垃圾收集器判断已经没有任何引用指向对象的时候,会调用对象的finalize方法来释放对象占据的内存空间~ java中垃圾回收以前听老师讲好像是内存满了他才去做一次整体垃圾回收,在回收垃圾的同时会调用 ...
- .Net平台GC VS JVM垃圾回收
前言 不知道你平时是否关注程序内存使用情况,我是关注的比较少,正好借着优化本地一个程序的空对比了一下.Net平台垃圾回收和jvm垃圾回收,顺便用dotMemory看了程序运行后的内存快照,生成内存快照 ...
- JVM原理三-----GC模块,垃圾回收
GC方法:在JVM启动时填入参数(比如:-XX:+UseConcMarkSweepGC ) 算法区分: 1.古老回收算法: Reference Counting ,对象有一个引用,即增加一个计数,删 ...
- 动图图解GC算法 - 让垃圾回收动起来!
原创:码农参上(微信公众号ID:CODER_SANJYOU),欢迎分享,转载请保留出处. 提到Java中的垃圾回收,我相信很多小伙伴和我一样,第一反应就是面试必问了,你要是没背过点GC算法.收集器什么 ...
- 【C# .Net GC】强制垃圾回收 和System GC
属性 GC.MaxGeneration:获取系统当前支持的最大代数. 方法 GC.GetTotalMemory(bool forceFullCollection) 方法 true表示该方法先做垃圾收 ...
- 【C# .Net GC】后台垃圾回收
在后台垃圾回收 (GC) 中,在进行第 2 代回收的过程中,将会根据需要收集暂时代(第 0 代和第 1 代). 后台垃圾回收是在一个或多个专用线程上执行的,具体取决于它是后台还是服务器 GC,它只适用 ...
随机推荐
- 学习AJAX必知必会(3)~自动重启工具nodemon、缓存问题、请求超时和网络异常、取消重复请求
1.nodemon 自动重启工具(自动重启基于nodejs开发的服务端应用) ■ nodemon 是一个工具,通过在检测到目录中的文件更改时自动重新启动node应用程序来帮助开发node.js. // ...
- 44.Prim算法
public static void main(String[] args) { //测试看看图是否创建ok char[] data = new char[]{'A','B','C','D','E', ...
- C++Template(类模板二)
namespace _myspace{ template<typename T, typename U> class TC { public: TC() { cout << & ...
- nginx多ip多端口多域名方式
目录 一:Nginx虚拟主机 1.基于ip的方式 2.基于多端口的方式 3.基于多域名的方式 一:Nginx虚拟主机 基于多IP的方式 基于多端口的方式 基于多域名的方式 1.基于ip的方式 [roo ...
- linux中yum本地私有仓库安装搭建《全面解析》
目录 一:yum本地仓库安装 1.yum简介 2.yum安装解析 二:yum安装的生命周期 三:yum私有仓库作用与必要性 四:搭建yum私有仓库 本地版本 1.下载必须的软件包 2.创建软件仓库(就 ...
- K8s配置配置存活、就绪和启动探测器
kubelet 使用存活探测器来知道什么时候要重启容器. 例如,存活探测器可以捕捉到死锁(应用程序在运行,但是无法继续执行后面的步骤). 这样的情况下重启容器有助于让应用程序在有问题的情况下更可用. ...
- SNAT技术
前面在讲解 firewall-config 工具的功能时,曾经提到了 SNAT(Source Network Address Translation,源网络地址转换)技术.SNAT 是一种为了解决 I ...
- STL中的隐性性能开销与副作用
1 隐性性能开销 1.1 STL容器的clear的时间复杂度不是O(1) 很多人潜意识认为STL容器中clear()成员函数的时间复杂度为常量时间复杂度O(1).原因是大家觉得对于vector而言,c ...
- [HNOI2009]双递增序列
不难发现本题贪心是不好做的,可以考虑 \(dp\). 首先的一个想法就是令 \(dp_{i, j, k, l}\) 表示当前选到第 \(i\) 个位置,当前第一个序列选了 \(j\) 个数,当前第一个 ...
- Springboot整合RocketMQ解决分布式事务
直接上代码: 代码结构如下: 依次贴出相关类: DataSource1Config: package com.example.demo.config;import org.apache.ibatis. ...