C# GC Finalizer IDispseable,.Net的垃圾回收机制
1.GC只能回收堆里的托管资源
2.GC 回收,"代"的概念
.net 托管资源分三代,代数越大 资源的生命周期越长.
0 代 和1代的资源比较少可以比较频率的回收, 回收2代以上差不多等于对整个应用程序的堆进行遍历了,比较不适合频繁的回收.
GC.Collection() 对所有代的资源进行遍历 回收, GC.collection(1) 则是只回收0代和1代
3.GC回收的过程
对没有被引用的堆资源标记成可回收,对已标记成可回收的资源进行回收,
对于有析构函数的资源判断是否已执行过析构函数,如果没有执行过,对其进行复活.如果有执行过了,标记成可回收,下次GC才回收.
回收完后堆中的资源压缩空间,可以理解成 垃圾箱中的一部份垃圾被灭霸消灭了,把垃圾箱重新踩实,堆中的地址发生了变化,栈,静态引用,CPU寄存器引用的指针更新地址
4.Finalization
在GC回收的过程中讲到析构函数,所以有必要补充的说一下什么是析构函数
publci class MyClass { ~MyClass() {
//在下就是析构函数
} }
析构函数的作用是用来释放非托管资源.C++资源 , stream ,ect..但是它只能被GC调用,回收的时机是不确定的.
5 IDispseable 接口
如果只是实现了析构函数,那么回收的时间不能确定,性能相对来说比较差.所以.Net给出另一个答案,IDispseable接口
此接口中只有一个方法 void Dispose();
void Dispose()
{
//释放非托管资源 GC.SuppressFinalize(this); //GC在回收时将不再调用此类的析构函数
}
用这个方法释放非托管之后还要执行这行代码 .
Dispose和Finalizeter 可以一起使用.MSDN上推荐的实现如下
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace MemoryTest.Model
{
public class MyClass : IDisposable
{
#region 变量声明
// 指向外部非托管资源
private IntPtr handle;
// 此类使用的其它托管资源.
private Component Components;
// 跟踪是否调用.Dispose方法,标识位,控制垃圾收集器的行为
private bool isDisposed = false;
#endregion #region Finalizer
~MyClass()
{
Dispose(false);
}
#endregion #region IDispseable 接口实现
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
#endregion #region 释放方法
/// <summary>
/// 释放非托管资源
/// </summary>
/// <param name="isManual">手动调用为true,系统调用为flase</param>
protected virtual void Dispose(bool isManual)
{
if (isDisposed) return;
isDisposed = true;
//释放非托管资源
handle = IntPtr.Zero; if (isManual)
{
//释放其他disose对象
Components?.Dispose();
} }
#endregion
}
}
C# GC Finalizer IDispseable,.Net的垃圾回收机制的更多相关文章
- GC(Garbage Collection)垃圾回收机制
1.在垃圾回收器中,程序员没有执行权,只有通知它的权利. 2.程序员可以通过System.gc().通知GC运行,但是Java规范并不能保证立刻运行. 3.finalize()方法,是java提供给程 ...
- 乐字节Java|GC垃圾回收机制、package和import
本文接上一篇:乐字节Java|this关键字.static关键字.block块.本文是接着讲述JavaGC垃圾回收机制.package 和 import语句. 一.GC垃圾回收机制 GC全名:Garb ...
- 垃圾回收机制GC知识再总结兼谈如何用好GC
一.为什么需要GC 应用程序对资源操作,通常简单分为以下几个步骤: 1.为对应的资源分配内存 2.初始化内存 3.使用资源 4.清理资源 5.释放内存 应用程序对资源(内存使用)管理的方式,常见的一般 ...
- asp.net 之 GC (垃圾回收机制)
今天抽时间好好整理了下GC相关知识,看了CSDN和博客园的几篇文章,有了一定的简单了解,决定根据个人理解整合一份随笔写下来,望诸位指教. 一:基础问题 1.首先需要知道了解什么是GC? GC如其名,就 ...
- 垃圾回收机制GC知识再总结兼谈如何用好GC(转)
作者:Jeff Wong 出处:http://jeffwongishandsome.cnblogs.com/ 本文版权归作者和博客园共有,欢迎围观转载.转载时请您务必在文章明显位置给出原文链接,谢谢您 ...
- 【C#复习总结】垃圾回收机制(GC)1
摘要:今天我们漫谈C#中的垃圾回收机制,本文将从垃圾回收机制的原理讲起,希望对大家有所帮助. GC的前世与今生 虽然本文是以.NET作为目标来讲述GC,但是GC的概念并非才诞生不久.早在1958年,由 ...
- 垃圾回收机制GC知识再总结兼谈如何用好GC(其他信息: 内存不足)
来源 图像操作,易内存泄露,边界像素 一.为什么需要GC 应用程序对资源操作,通常简单分为以下几个步骤: 1.为对应的资源分配内存 2.初始化内存 3.使用资源 4.清理资源 5.释放内存 应用程序对 ...
- .NET 之 垃圾回收机制GC
一.GC的必要性 1.应用程序对资源操作,通常简单分为以下几个步骤:为对应的资源分配内存 → 初始化内存 → 使用资源 → 清理资源 → 释放内存. 2.应用程序对资源(内存使用)管理的方式,常见的一 ...
- Android内存优化3 了解java GC 垃圾回收机制1
开篇废话 如果我们想要进行内存优化的工作,还是需要了解一下,但这一块的知识属于纯理论的,有可能看起来会有点枯燥,我尽量把这一篇的内容按照一定的逻辑来走一遍.首先,我们为什么要学习垃圾回收的机制,我大概 ...
随机推荐
- Deepin系统更新apt-get源
1.复制原文件备份sudo cp /etc/apt/source.list /etc/apt/source.list.bak2.编辑源列表文件sudo vim /etc/apt/source.list ...
- SQLite单表4亿订单,大数据测试
[转载] SQLite单表4亿订单,大数据测试 http://www.cnblogs.com/nnhy/p/BigData.html
- 记录一次mysql由5.6升级到5.7出现的异常---Expression #23 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'c.commentCount' which is not functionally dependent on columns in GROUP BY clause;
### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Expre ...
- web报表工具FineReport经常使用函数的使用方法总结(文本函数)
文本函数 CHAR CHAR(number):依据指定数字返回相应的字符.CHAR函数可将计算机其它类型的数字代码转换为字符. Number:用于指定字符的数字,介于1Number:用于指定字符的数字 ...
- iOS 下APNS推送处理函数具体解释
相比起Android,iOS在推送方面无疑惯例得更好.APNS(Apple Push Notification Service)是苹果公司提供的消息推送服务.其原理就是.第三方应用将要推送给用户的信息 ...
- Python 网络爬虫与信息获取(一)—— requests 库的网络爬虫
1. 安装与测试 进入 cmd(以管理员权限),使用 pip 工具,pip install requests 进行安装: 基本用法: >> import requests >> ...
- 不使用left-join等多表关联查询,只用单表查询和Java程序,简便实现“多表查询”效果
上次我们提到,不使用left-loin关联查询,可能是为了提高效率或者配置缓存,也可以简化一下sql语句的编写.只写单表查询,sql真得太简单了.问题是,查询多个表的数据还是非常需要的. 因此,存在这 ...
- SEO那些事:一句代码一键分享网站
这是很久以前就已经写过的笔记了,有一个习惯,每次遇到一个问题,都会进行百度,然后把解决问题的关键点记录下来,有人问我,为什么更新频率如此之快,大部分都是从前积累的知识点. 其实每天工作所涉及的知识点都 ...
- 使用PowerDesigner15在win7下的系统MySQL p相反roject(一)
使用PowerDesigner15在win7下的系统MySQL 相反project 1.首先.安装下面的驱动 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv ...
- VB的MSHFlexGrid控件内容导入Excel
机房收费系统中有非常多窗口用到导出到Excel,说一下vb与Excel的交互,怎样才干将MSHFlexgrid中的内容导出到Excel. 首先在VB中加入引用Microsoft Excel 14.0 ...