c#内存管理,垃圾回收和资源释放
<1>关于虚拟内存的概念
Windows使用一个虚拟寻址系统,该系统把程序可用的内存地址映射到硬件内存中的实际地址上去,这些任务完全由windows后台管理,其实际结果是32位处理机上的每个进程都可以使用4GB内存,这个内存称为虚拟内存;
<2>栈和堆的概念
栈:在进程的虚拟内存中,有一个区域称为栈,栈存储的是值数据类型,在程序第一次开始运行的时候,栈指针指向为栈保留的内存块的末尾,栈实际上是从高地址内存向低地址内存分配的,在释放变量时,恰好相反;
堆:托管堆是虚拟内存的另一个内存区域,堆的内存是由下往上分配的,这一点与栈不同,例如实例化一个类,这个对象的引用信息存储在栈上,这个对象的实例信息保存在堆上,当引用变量超出作用域后,它会从栈中删除,但是引用对象的数据仍然会保留在堆中,直到程序结束或者垃圾回收器删除它为止,而只有在该数据不再被任何变量引用的时候,它才会被删除;
<3>垃圾回收
垃圾回收器运行时,它会降低应用程序的性能,因为垃圾回收器完成其任务之前,应用程序不可能继续执行,所以垃圾回收器采用的是世代垃圾回收器;提高垃圾回收器的另外一个方法是架构处理堆上较大对象的方式,较大对象有自己的托管堆,而不是在主堆上;
<4>释放非托管的资源
垃圾回收器不知道如何释放非托管的资源(例如文件句柄,网络连接和数据库连接),通常有两种方式来释放非托管的资源:一是声明一个析构函数(或终结器),作为类的一个成员,二是在类中实现System.IDisposable接口;
<5>析构函数
c#析构函数有两个缺点:一是由于c#采用了垃圾回收器的工作方式,无法确定析构函数何时执行,所以不能再析构函数中放置需要在某一时刻运行的代码,也不应该使用能以任意顺序对不同类的实例调用的析构函数,二是c#析构函数的实现会延迟对象从内存中删除的时间,没有析构函数的对象会在垃圾回收器的一次处理中从内存中删除,但有析构函数的对象需要两次才能够删除,如果频繁的使用析构函数,而且使用它们执行长时间的清理任务,对性能的影响就会非常的显著;
<6>IDisposable接口
在c#中,推荐使用System.IDisposable接口替代析构函数,IDisposable接口定义了一种模式,该模式为释放非托管的资源提供了确切的机制,并避免产生析构函数固有的与垃圾回收器相关的问题,它声明了一个Dispose()方法,Dispose()方法显式的释放由对象直接使用的所有非托管资源;但是要考虑到一个问题就是如果程序中间出现异常可能会出现不执行这个方法的情况,这时要放在try...finally块中,这样又会使代码看起来很混乱,这时可以放在using里面;
c#内存管理,垃圾回收和资源释放的更多相关文章
- python内存管理&垃圾回收
python内存管理&垃圾回收 引用计数器 环装双向列表refchain 在python程序中创建的任何对象都会放在refchain连表中 name = '张三' age = 18 hobby ...
- Java 类加载机制 ClassLoader Class.forName 内存管理 垃圾回收GC
[转载] :http://my.oschina.net/rouchongzi/blog/171046 Java之类加载机制 类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指 ...
- [CLR via C#]21. 自动内存管理(垃圾回收机制)
目录 理解垃圾回收平台的基本工作原理 垃圾回收算法 垃圾回收与调试 使用终结操作来释放本地资源 对托管资源使用终结操作 是什么导致Finalize方法被调用 终结操作揭秘 Dispose模式:强制对象 ...
- 内存管理 垃圾回收 C语言内存分配 垃圾回收3大算法 引用计数3个缺点
小结: 1.垃圾回收的本质:找到并回收不再被使用的内存空间: 2.标记清除方式和复制收集方式的对比: 3.复制收集方式的局部性优点: https://en.wikipedia.org/wiki/C_( ...
- [Python之路] 内存管理&垃圾回收
一.python源码 1.准备源码 下载Python源码:https://www.python.org/ftp/python/3.8.0/Python-3.8.0.tgz 解压得到文件夹: 我们主要关 ...
- Java进阶 JVM 内存与垃圾回收篇(一)
JVM 1. 引言 1.1 什么是JVM? 定义 Java Vritual Machine - java 程序的运行环境(Java二进制字节码的运行环境) 好处 一次编译 ,到处运行 自动内存管理,垃 ...
- Java内存与垃圾回收调优
Java(JVM)内存模型 正如你从上面的图片看到的,JVM内存被分成多个独立的部分.广泛地说,JVM堆内存被分为两部分——年轻代(Young Generation)和老年代(Old Generat ...
- 【转】Java内存与垃圾回收调优
要了解Java垃圾收集机制,先理解JVM内存模式是非常重要的.今天我们将会了解JVM内存的各个部分.如何监控以及垃圾收集调优. Java(JVM)内存模型 正如你从上面的图片看到的,JVM内存被分成多 ...
- 推荐收藏系列:一文理解JVM虚拟机(内存、垃圾回收、性能优化)解决面试中遇到问题(图解版)
欢迎一起学习 <提升能力,涨薪可待篇> <面试知识,工作可待篇 > <实战演练,拒绝996篇 > 欢迎关注我博客 也欢迎关注公 众 号[Ccww笔记],原创技术文章 ...
随机推荐
- Springboot读取自定义的yml文件中的List对象
Yml文件(novellist.xml)如下: novellist: list: - name: 笑傲江湖 type: 武侠 master: 令狐冲 a ...
- filename extension
题目描述 Please create a function to extract the filename extension from the given path,return the extra ...
- [RK3288][Android6.0] 调试笔记 --- 通用GPIO驱动控制LED【转】
本文转载自:http://m.blog.csdn.net/kris_fei/article/details/69553422 Platform: ROCKCHIPOS: Android 6.0Kern ...
- 【POJ 2407】 Relatives
[题目链接] 点击打开链接 [算法] 欧拉函数 [代码] #include <algorithm> #include <bitset> #include <cctype& ...
- bzoj1087互不侵犯King——状压DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1087 水题... 然而犯了两个致命小错误,调了好半天...详见注释. 代码如下: #incl ...
- Android开发中几种有用的的日历控件实现
我们大家都知道,在Android平台3.0中才新增了日历视图控件,可以显示网格状的日历内容,那么对于3.0以下的版本要使用日历控件只能借助第三方,目前用的最多的是CalendarView. 先简单介绍 ...
- JAVA sleep() & wait()
对于sleep()方法,我们首先要知道该方法是属于Thread类中的.而wait()方法,则是属于Object类中的. sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监 ...
- css3 appearance 改变元素外观
h5 input标签的默认样式去除: 去掉date类型<input>框的叉叉: ::-webkit-clear-button { -webkit-appearance: none; } 去 ...
- 禁用选择文本功能user-select
有时候,我们为了用户体验,需要禁用选择文本功能. 这需要用到一个CSS属性:user-select,user-select的文档点这里 user-select有两个值:none:用户不能选择文本tex ...
- caffe 入门实例3 fine-turning
占坑,使用fine-turning初始化参数...