C# 第二天

1.内存,栈,堆

(1)windows使用一个虚拟的寻址系统,该系统把程序可用的内存地址映射到硬件内存中的实际地址上。4GB的内存称为虚拟地址空间,或虚拟内存,简称内存。这4GB的内存中的每个的存储单元都是从0开始往上排序。从低地址往高地址分配。

(2)在这4GB的内存中有一个区域成为栈,程序第一次运行时,栈指针指向为栈保留的内存块末尾,栈实际上是是从下填充的,即从高内存地址向低内存地址填充。

(3)托管堆(简称为堆)是内存中的另外一个内存区域。堆上的内存是向上分配的。


2 垃圾回收

(1)在垃圾回收器运行时,它会从堆中删除不再引用的所有对象。垃圾回收器在引用的根表中找到所有的对象,接着在引用的对象树种查找。在完成删除操作后,堆会立即把对象分散开来,与已经释放的内存混合在一起。

(2)垃圾回收器释放了能释放的所有对象后,就会把其他对象移回到堆得顶端,再次形成一个连续的内存块。因此堆可以像栈那样确定在什么地方存储新对象。当然在移动对象时,这些对象的所有引用都需要正确的新地址来更新


3.处理非托管的资源

垃圾回收器不知道如何释放非托管的资源(例如,文件句柄,网络连接和数据库连接),使用两种机制来释放非托管的资源

(1)声明一个析构函数(或终结器),作为类的一个成员

(2)在类中实现System.IDisposeable 接口

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • [TOC] 内存管理 一、托管堆基础 在面向对象中,每个类型代表一种可使用的资源,要使用该资源,必须为代表资源的类...
    _秦同学_阅读 4,114评论 0 3
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,663评论 1 32
  • 快速消息队列 (FMQ) HIDL 的远程过程调用 (RPC) 基础架构使用 Binder 机制,这意味着调用涉及...
    Lee_5566阅读 9,027评论 0 8
  • 前言 不知道大家有没有这样一种感觉,程序员的数量井喷了。可能是因为互联网火了,也可能是各家培训机构为我们拉来了大量...
    活这么大就没饱过阅读 2,844评论 6 25
  • 这篇文章是我之前翻阅了不少的书籍以及从网络上收集的一些资料的整理,因此不免有一些不准确的地方,同时不同JDK版本的...
    高广超阅读 16,051评论 3 83

友情链接更多精彩内容