【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,它只适用 ...
随机推荐
- 【涨姿势】原来golang的case <-time.After(xxx)还有这样的坑
偶然看到这样一篇文章:<使用 pprof 排查 Golang 内存泄露>https://www.toutiao.com/i6881796351139676680/ 最后一段让我很疑惑: 修 ...
- 【小记录】解决链接libcufft_static.a库出现的错误
程序中使用了 cv::cuda::dft() 函数,需要在链接的时候使用libcufft_static.a这个库.链接出现大量类似错误:error: undefined reference to __ ...
- 【小记录】arm64下的原子加
1.代码中使用atomic_add aarch64下面并没有任何关于atomic的头文件 编译出现错误: /Users/ahfu/code/android/android-ndk-r14b/toolc ...
- virtual stuido同时调试多个控制台
问题 UDP作业需要服务器端和客户端收发信息完成交互,需要同时调试多个窗口. 解决办法 但是缺点依然是无法调试2个,修改另一个测试. 所以多开可能依然是好办法.
- load-on-startup元素:控制Servlet启动优先级
load-on-startup 是 web.xml 中的一个节点,是 servlet 元素的子元素,用来标记 Servlet 容器启动时是否初始化当前 Servlet,以及当前 Servlet 的初始 ...
- /usr/local /opt
Linux 的软件安装目录是也是有讲究的,理解这一点,在对系统管理是有益的 /usr:系统级的目录,可以理解为C:/Windows/, /usr/lib理解为C:/Windows/System32. ...
- maven项目 子父级工程。
一 .什么是 maven 子父级工程? 建立一个maven项目,然后在该项目 下创建一个module,子级的maven,他继承于父级项目. 1.新建立 maven项目,file ------new- ...
- 一步一步搭建基于ffmpeg和sdl2的流媒体播放器
一. 背景: 一步一步从资料收集.技术选型.代码编写.性能优化,动手搭建一款支持rtsp.rtmp等常用流媒体格式的视频播放器,ffmpeg用于流媒体解码,sdl2用于视频画面渲染和声音播放. 二. ...
- 关于tx:method和pointcut中的方法,即事务管理中的方法和切入点表达式中的方法具体如何执行
<tx:advice id="transaction" tranction-manager="transactionManager"> <tx ...
- Docker 与 K8S学习笔记(二十二)—— 高效使用kubectl的小技巧
kubectl作为我们主要的操作K8S的工具,其具备非常丰富的功能,但是如果不经过打磨,使用起来还是存在诸多不便,今天我们来看看如何将我们的kubectl打磨的更加易用. 一.命令自动补全 kubec ...