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笔记],原创技术文章 ...
随机推荐
- ABAP range 用法
转自http://www.sapjx.com/abap-range-table.html 1. Range Table 概述 Range Table 为 SAP R/3系统标准内表的一种,结构与 Se ...
- window10 java 环境变量配置
JAVA_HOME (可有可无) CLASSPATH : C:\Program Files\Java\jdk1.8.0_91\lib\dt.jar;C:\Program Files\Java\j ...
- oracle中去掉文本中的换行符、回车符、制表符
一.特殊符号ascii定义 制表符 chr(9) 换行符 chr(10) 回车符 chr(13) UPDATE tc_car_order set USE_REASON = REPLACE('USE ...
- GUI界面资源
30个真棒的(免费iPhone,iPad IOS)的GUI 界面设计元素模板 做iphone开发的福音 创造力是指任何一种演示设计i的能力.无论是一个标志,旗帜,广告或一个完整的设计,能够注入的创 ...
- can't set android permissions - built without android support
/**************************************************************************** * can't set android pe ...
- BZOJ_1406_[AHOI2007]密码箱_枚举+数学
BZOJ_1406_[AHOI2007]密码箱_枚举+数学 Description 在一次偶然的情况下,小可可得到了一个密码箱,听说里面藏着一份古代流传下来的藏宝图,只要能破解密码就能打开箱子,而箱子 ...
- react之fetch请求json数据
Fetch下载 npm install whatwg-fetch -S Fetch请求json数据 json文件要放在public内部才能被检索到
- bzoj2839
容斥原理+组合数学 看见这种恰有k个的题一般都是容斥原理,因为恰有的限制比较强,一般需要复杂度较高的方法枚举,而容斥就是转化为至少有k个,然后通过容斥原理解决 我们先选出k个元素作为交集,有C(n,k ...
- bzoj1097
最短路+状压dp 肯定是状压dp 那么我们把k个点的单源最短路预处理出来,然后dp[i][j]表示状态为i,当前在j需要走的最短距离,给定的限制用状态压一下就行了 注意特判k=0的情况 #includ ...
- 041--Jquery
一.Jquery对象 jQuery 对象就是通过jQuery包装DOM对象后产生的对象.jQuery 对象是 jQuery 独有的. 如果一个对象是 jQuery 对象, 那么它就可以使用 jQuer ...