我最近碰到一个机会去做听起来比较高级的事情,有点兴奋,有点害怕,毕竟那个领域不是我很擅长的,但是我多多少少会点,而且我特别想去触碰那个领域!这种复杂的心情伴了我整整一天一夜,以至于我一回家就心心念念拿起了书本去啃,却一个字都没有啃下去。但无疑我是想握住这机会的,像我这种人注定是走钢丝型的:
曾经在 幽幽 暗暗 反反 复复 中追问
才知道 平平 淡淡 从从 容容 才是真
再回首 恍然如梦
再回首 我心依旧
只有那 无尽的长路 伴着我
我还是抓紧时间把这本书的笔记写完,今天很巧要搬运的笔记是关于托管和非托管资源这块的内容,搞c#的经常会听到前辈说这些个词o(* ̄︶ ̄*)o,但很多年轻的程序员压根不重视偏底层的原理!这是非常不对的,你不重视就不知道自己写的好不好、对不对。所以这里我写的尽可能详细点,把我的所思所想都写出来,也当给自己敲个警钟。
后台内存管理
在c#中你会经常听到资源两个子,无论你是在做WPF的时候,还是在做其它的时候。在这里讲的资源就是指——存储在托管或本机堆中的对象。尽管垃圾收集器释放存储在托管堆中的托管对象,但不释放本机堆中的对象。使用托管环境时,很容易注意不到内存管理,因为你认为垃圾回收器(GC)会处理它。所以我们需要一步步去了解内存管理和内存访问的各个方面,才能更加高效地处理内存。
windows使用虚拟寻址系统,该系统把程序可用的内存地址映射到硬件内存中的实际地址上,这些任务完全由windows在后台管理。对于32位的操作系统一般情况下(不管你的物理内存多大)使用的内存为4GB,这里面放执行的代码、代码加载的所有DLL,已经运行中使用的所有变量的内容。而这4GB的内存就称为虚拟地址空间,或虚拟内存。(以下的内存都是虚拟内存,堆都是托管堆)
我稍微做个补充解释,在我们学习《计算机操作系统原理》的时候,或多或少会记得老师讲过的分页存储、分段存储这两个策略行为。在以前我们需要多个运行多个进程的时候,往往都会把他们都放在内存中。后来有了虚拟存储技术,就是你不需要将进程的全部都放在内存之中。有一篇文章介绍挺好的http://c.biancheng.net/view/1270.html。等到时候我把这文章更新,画个图解释一下一定能懂。
回过头,这4GB每个单元都是从0开始往上走的,你需要访问虚拟内存中的某个空间的一个值时,你就需要提供表示该存储单元的数字,你可以理解为变量名其实就是一个内存地址。在这虚拟内存中有堆、栈。栈存储的是非对象成员的值类型,还有你在调用方法时,由栈去传递所有方法的参数副本,就是说参数是复制的不是源的。栈是弹压式逻辑,是后进先出,如