<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#内存管理,垃圾回收和资源释放的更多相关文章

  1. python内存管理&垃圾回收

    python内存管理&垃圾回收 引用计数器 环装双向列表refchain 在python程序中创建的任何对象都会放在refchain连表中 name = '张三' age = 18 hobby ...

  2. Java 类加载机制 ClassLoader Class.forName 内存管理 垃圾回收GC

    [转载] :http://my.oschina.net/rouchongzi/blog/171046 Java之类加载机制 类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指 ...

  3. [CLR via C#]21. 自动内存管理(垃圾回收机制)

    目录 理解垃圾回收平台的基本工作原理 垃圾回收算法 垃圾回收与调试 使用终结操作来释放本地资源 对托管资源使用终结操作 是什么导致Finalize方法被调用 终结操作揭秘 Dispose模式:强制对象 ...

  4. 内存管理 垃圾回收 C语言内存分配 垃圾回收3大算法 引用计数3个缺点

    小结: 1.垃圾回收的本质:找到并回收不再被使用的内存空间: 2.标记清除方式和复制收集方式的对比: 3.复制收集方式的局部性优点: https://en.wikipedia.org/wiki/C_( ...

  5. [Python之路] 内存管理&垃圾回收

    一.python源码 1.准备源码 下载Python源码:https://www.python.org/ftp/python/3.8.0/Python-3.8.0.tgz 解压得到文件夹: 我们主要关 ...

  6. Java进阶 JVM 内存与垃圾回收篇(一)

    JVM 1. 引言 1.1 什么是JVM? 定义 Java Vritual Machine - java 程序的运行环境(Java二进制字节码的运行环境) 好处 一次编译 ,到处运行 自动内存管理,垃 ...

  7. Java内存与垃圾回收调优

     Java(JVM)内存模型 正如你从上面的图片看到的,JVM内存被分成多个独立的部分.广泛地说,JVM堆内存被分为两部分——年轻代(Young Generation)和老年代(Old Generat ...

  8. 【转】Java内存与垃圾回收调优

    要了解Java垃圾收集机制,先理解JVM内存模式是非常重要的.今天我们将会了解JVM内存的各个部分.如何监控以及垃圾收集调优. Java(JVM)内存模型 正如你从上面的图片看到的,JVM内存被分成多 ...

  9. 推荐收藏系列:一文理解JVM虚拟机(内存、垃圾回收、性能优化)解决面试中遇到问题(图解版)

    欢迎一起学习 <提升能力,涨薪可待篇> <面试知识,工作可待篇 > <实战演练,拒绝996篇 > 欢迎关注我博客 也欢迎关注公 众 号[Ccww笔记],原创技术文章 ...

随机推荐

  1. redis02---对于key的操作命令

    Redis对于key的操作命令 del key1 key2 ... Keyn 作用: 删除1个或多个键 返回值: 不存在的key忽略掉,返回真正删除的key的数量 rename key newkey ...

  2. 总结 <stdlib.h>头文件 在算法中可能会用到的一些函数

    头文件<stdlib.>具有一定的总结性. 它定义了类型.宏和各种函数,这些函数用于:内存管理.排序和查找.整形运算.字符串到数字的转换.伪随机数序列.与环境的接口.把多字节字符串和字符转 ...

  3. 计算机学院大学生程序设计竞赛(2015’12)Happy Value

    Happy Value Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  4. Swift(一)简单值

    Swift的源文件扩展名是.swift 按照国际惯例,学习一门新语言写的第一个程序都是在屏幕上输出一句 “Hello, world!” .在Swift里,一行代码就搞定了: 如果你以前写过C或者Obj ...

  5. MyEclipse注释配置

    MyEclipse注释配置 配置路径 1.1.      JAVA 打开MyEclipse,选择Window>Preferences>Java>Code Style>Code ...

  6. Oracle:ORA-01790: expression must have same datatype as corresponding expression

    今天有现场报sql错误,错误sql语句 类似  select * from  tableA  where (exists  条件A   or exists 条件B), 单独执行  select * f ...

  7. 关于O_DIRECT的那些事儿

    很久之前落下的坑,一直没怎么记录-.- 一般地,如果在Linux内核中读写一个文件,其IO流程都需要经过Kernel内的page cache层次,如果程序员若想要使用自己开发的缓存系统,那么就可以在打 ...

  8. USACO 5.4 tour的dp解法

    题意:有n个点排成序列,两个人甲乙从1出发,到达n,中间的点不允许到达两次,只能从左向右走,问最多两人访问多少点. (膜大佬) 解: dp f(i, j) 表示甲到了i点,乙到了j点,两人最多访问了多 ...

  9. django上课笔记7-jQuery Ajax 和 原生Ajax-伪造的Ajax-三种Ajax上传文件方法-JSONP和CORS跨域资源共享

    一.jQuery Ajax 和 原生Ajax from django.conf.urls import url from django.contrib import admin from app01 ...

  10. Mysql基础调优

    mysql基础的优化方式 1.利用索引加快查询速度 2.利用查询缓存或者旁挂式缓存,提高访问速度 缓存:k/v key:查询语句的hash值 value:查询语句的执行结果 哪些查询可能不会被缓存? ...