C#GC垃圾回收和析构函数和IDisposable的使用
一,什么是GC
1,GC是垃圾回收器,一般来说系统会自动检测不会使用的对象或变量进行内存的释放,不需要手动调用,用Collect()就是强制进行垃圾回收,使内存得到及时的释放,让程序效率更高.
2,GC:只负责回收托管对象,不负责回收非托管对象。
那什么是垃圾? 垃圾是完全访问不到的东西了,就是当前程序执行后该对象或值没有被引用
如下图:

代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace TestDemo
{
public class TestDemo
{
private static Test t = new Test()//静态的不可能被回收 静态持有的引用也不会被回收
{
Id = ,
Name = "Test"
};
public static void show()
{
///{}这个括号是代码分块的意思,两个块之间是不影响的,第一块执行完后,一般来说就是会被主动GC释放
///而这里obj没有被释放的原因是因为静态遍历对obj这个引用类型变量的使用
{
object obj= new { Name = };
t.obj = obj;
int i = ;//都会被GC
TestDemo testDemo = new TestDemo();//都会被GC
}
{
GC.Collect();//主动GC
}
}
} public class Test
{
public int Id { get; set; }
public string Name { get; set; }
public object obj { get; set; }
}
}
总结:程序执行完会回收垃圾,这个obj还在静态的t使用,所以没有被释放
那GC怎么回收呢?
1,new的时候发现内存不够 就去遍历所有堆的对象,标记访问不到,然后启动一个线程来清理内存
2,清除标记了的对象,其他挪动,然后整齐摆放,所以这个时候全部线程停止,不允许操作内存
3,内存不够的是指一级对象的内存,有个临界值,也不是全部的堆的大小
GC回收执行的过程:
1, 首次GC前 全部对象都是0级
2, 第一次GC后,还保留的对象叫1级
3, 回收先找0级对象,如果空间还不够,再去找1级对象,这之后,还存在的对象就变成2级
4, 0级不够,1级也不够,2级还不够,那就内存溢出了
5,越是最近分配的,越是会被回收 比如for循环创建对象
大对象和正常的对象缓存的地址是不一样的。
大对象策略:如果大于某个值的对象85k,单独管理,用的是链表(碎片),避免频繁的内存移动
二,析构函数和IDisposable的区别?
~Class() 析构函数: 主要是用来释放非托管资源,等着GC的时候去把非托管资源释放掉 系统自动执行
GC回收的时候,CLR一定调用的,但是可能有延迟(释放对象不知道要多久呢)
Dispose() :也是释放非托管资源的,主动释放,方法本身是没有意义的,我们需要在方法里面实现对资源的释放
GC不会调用,而是用对象时,使用者主动调用这个方法,去释放非托管资源,
而不是说对象释放的时候,会去自动调用Dispose方法,然后在用完对象时,我们主动去执行dispose方法,当然可以是using的快捷方式
如下代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace TestDemo
{
public class TestDemoThree
{
public static void show()
{
{
for (int i = ; i < ; i++)
{
TestThree @class = new TestThree()
{
Id = i,
Name = "TestThree"
};
}
}
{
GC.Collect(); //主动GC的时候,CLR一定调用的析构函数
}
{
///using 这个会去调用调用的dispose,相当于try后的finally
using (TestThree TestThree = new TestThree()
{
Id = ,
Name = ""
}) try
{
//using相当于
}
finally
{
//调用的dispose()
}
}
} public class TestThree : IDisposable
{
public int Id { get; set; }
public string Name { get; set; }
~TestThree()
{
Console.WriteLine($"执行{this.GetType().Name}~TestThreeDispose");
}
public void Dispose()
{
Console.WriteLine($"执行{this.GetType().Name}Dispose");
}
}
}
}
主动执行GC执行结果

using执行结果

C#GC垃圾回收和析构函数和IDisposable的使用的更多相关文章
- GC垃圾回收
我们在开发需求的时候,可能很少关注到垃圾回收,因为我们绝大多数的时候都是使用的托管资源,托管资源的内存回收.net已经帮我们做了,但是.net的内存回收不是实时的,所以我们还是要关注下.net的垃圾回 ...
- 通俗易懂.NET GC垃圾回收机制(适用于小白面试,大牛勿喷)
情景:你接到xx公司面试邀请,你怀着激动忐忑的心坐在对方公司会议室,想着等会的技术面试.技术总监此时走来,与你简单交谈后.... 技术:你对GC垃圾回收机制了解的怎么样? 你:还行,有简单了解过. 技 ...
- .Net平台的GC垃圾回收
一.先了解下必备的知识前提 内存中的托管与非托管,可简单理解为: 托管:可借助GC从内存中释放的数据对象(以下要描述的内容点) 非托管:必须手工借助Dispose释放资源(实现自IDisposable ...
- 数往知来C#之接口 值类型与引用类型 静态非静态 异常处理 GC垃圾回收 值类型引用类型内存分配<四>
C# 基础接口篇 一.多态复习 使用个new来实现,使用virtual与override -->new隐藏父类方法 根据当前类型,电泳对应的方法(成员) -->override ...
- GC垃圾回收算法
什么是GC垃圾回收呢.日常生活中我们去餐厅吃饭吃完饭,吃完饭走了餐具不用管,服务员在把餐具拿走,这是一种方式,服务员怎么知道他要来把餐具拿走呢,因为你走了,这个位置空了.服务员什么时候拿走餐具很重要, ...
- JVM学习02:GC垃圾回收和内存分配
JVM学习02:GC垃圾回收和内存分配 写在前面:本系列分享主要参考资料是 周志明老师的<深入理解Java虚拟机>第二版. GC垃圾回收和内存分配知识要点Xmind梳理 案例分析1-(G ...
- JVM和GC垃圾回收机制和内存分配
JVM运行期间 线程共享 线程私有 线程共享: 方法区 堆方法区:存放可以共享数据,静态常量,类的共有方法属性字段等,可以共享的存在方法区. 堆:存放class对象 . 线程私有:本地方法栈 虚拟机栈 ...
- RPC调用与GC垃圾回收
RPC调用 多个服务协同完成一次业务时,由于业务约束(如红包不符合使用条件.账户余额不足等).系统故障(如网络或系统超时或中断.数据库约束不满足等),都可能造成服务处理过程在任何一步无法继续,使数据处 ...
- Java虚拟机笔记(二):GC垃圾回收和对象的引用
为什么要了解GC 我们都知道Java开发者在开发过程中是不需要关心对象的回收的,因为Java虚拟机的原因,它会自动回收那些失效的垃圾对象.那我们为什么还要去了解GC和内存分配呢? 答案很简单:当我们需 ...
随机推荐
- Elastic-Job快速入门
1 Elastic-Job快速入门1.1 环境搭建1.1.1.版本要求JDK要求1.7及以上版本Maven要求3.0.4及以上版本zookeeper要求采用3.4.6及以上版本1.1.2.Zookee ...
- CCA(典型相关分析)
https://www.cnblogs.com/pinard/p/6288716.html
- PHP通用后台管理系统发布!
下载地址:https://gitee.com/lim2018/phpadmin
- 超过 150 个最佳机器学习,NLP 和 Python教程
超过 150 个最佳机器学习,NLP 和 Python教程 微信号 & QQ:862251340微信公众号:coderpai简书地址:http://www.jianshu.com/p/2be3 ...
- python学习笔记:(六)str(字符串)常用方法
注意点: 1.字符串是不可变的: 2.%格式化操作符:左侧放置字符串,右侧放置希望被格式化的值. 对于单个字符的编码,Python提供了ord()函数获取字符的整数表示,chr()函数把编码转换为对应 ...
- 几家大的券商的PB系统以及算法交易概况大致是怎样的?
PB的定位是托管-清算-交易.目前的PB系统方面的竞争点主要放在了交易环节(毕竟托管和清算没有多大的差异).目前的pb交易环节的技术提供有恒生.讯投.金证.同花顺等,以满足私募及高净值个人多样化交易和 ...
- ES6标准入门 第三章:变量的解构赋值
解构赋值:从数组和对象中提取值,对变量进行赋值. 本质上,这种写法属于“匹配模式”:只要等号两边的模式相同,左边的变量就会被赋予对应的值. 1.数组的结解构赋值 基本用法 let [foo, [[ba ...
- 【MM系列】MB1A MB1B MB1C MB11 MIGO的区别解析
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]MB1A MB1B MB1C MB1 ...
- Linux 系统安装 python
Centos 7 Centos 7 安装 python3 (不要卸载python2 因为yum 要用) https://phoenixnap.com/kb/how-to-install-python- ...
- 应用安全 - CMS - ThinkCMF - 漏洞汇总
ThinkCMF X1.6.0-X2.2.3任意内容包含漏洞 Date: 2019.10 类型: 任意文件写入导致远程代码执行 影响范围: ThinkCMF X1.6.0 ThinkCMF X2.1. ...