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笔记],原创技术文章 ...
随机推荐
- file类简单操作
file类可表示文件或文件夹 import java.io.File; import java.io.FilenameFilter; import java.io.IOException; impor ...
- js中return的作用
1.终止函数的继续运行. 当遇到if…… else是.若出现return,就会出现终止运行,不会继续做出判断 <html> <head> <title>return ...
- 数组、栈、堆(java基础知识五)
1.数组概述.定义格式 * A:数组概念 数组是存储同一种数据类型多个元素的集合.也可以看成是一个容器. 数组既可以存储基本数据类型,也可以存储引用数据类型. * B:数组定义格式 格式1:数据类型[ ...
- 完美解决pip install scrapy,安装Scrapy错误:Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools
1,在Python3.6 安装Scrapy 出现以下报错 2,错误分析 红色报的错误指向的是Twisted 1,Twisted 没安装上 2,Twisted 没安装成功 3,Twisted 版本与Py ...
- codeforces 437A. The Child and Homework 解题报告
题目链接:http://codeforces.com/problemset/problem/437/A 题目意思:给出四个选项A.B.C.D选项的内容描述,要求选出符合以下条件的一项. (1)如果某个 ...
- Windows Mysql启动出现1069错误 “由于登录失败而无法启动服务” 的处理方法
问题现象 windows下mysql服务无法启动,报1069错误. 问题原因 如果Mysql启动用户的密码或者权限错误,会导致Windows服务器Mysql启动时出现"由于登录失败而无法启动 ...
- AJAX如何传递json对象给后端
如果页面上一直报错,根本没有触发异步请求的话,首先就要检查接口或者路径是否写对或者写全,在去考虑是否跨境的问题. 如果想要给后端传递一个json对象,需要在路径上一句添加content:applica ...
- Watir: Watir-WebDriver对打开的浏览器attach操作
Watir-WebDriver对于已经打开的浏览器,没有办法进行Attach操作. 但是对于自动化操作浏览器过程中点击某链接,打开的新浏览器,是能够定位到的. require 'watir-webdr ...
- 六个优雅的 Linux 命令行技巧
一些非常有用的命令能让命令行的生活更满足,使用 Linux 命令工作可以获得许多乐趣,但是如果您使用一些命令,它们可以减少您的工作或以有趣的方式显示信息时,您将获得更多的乐趣.在今天的文章中,我们将介 ...
- 伪元素 first-letter
::after, ::before, ::backdrop, ::first-letter,::first-line, ::selection(css3)是伪元素, :active, :focus, ...