资源预览内容
第1页 / 共29页
第2页 / 共29页
第3页 / 共29页
第4页 / 共29页
第5页 / 共29页
第6页 / 共29页
第7页 / 共29页
第8页 / 共29页
第9页 / 共29页
第10页 / 共29页
亲,该文档总共29页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
基于C#的 .NET Framework程序设计n第10章 数据流和文件 n第11章 Internet访问n第12章 序列化 n第13章 远程处理和XML Web Servicen第14章 线程和异步编程 n第15章 托管代码与非托管代码 之间的互操作n第16章 使用Microsoft ADO.NET 访问数据n第17章 属性n第1章 Microsoft .NET Framework概述n第2章 托管执行环境的介绍n第3章 使用组件 n第4章 部署与版本控制n第5章 通用类型系统 n第6章 类型的使用 n第7章 字符串、数组和集合n第8章 委托和事件n第9章 内存和资源管理 第9章 内存和资源管理n内存管理基础n非内存资源管理n优化垃圾回收内存管理基础n开发者背景n人工内存管理和自动内存管理的比较n .NET Framework 类型的内存管理 n简单垃圾回收9.1 内存管理基础开发者背景nCOMl开发者手工实现引用计数和处理循环引用nC+l开发者用 new 和 delete 操作符手工管理内存nVisual Basicl开发者习惯于自动内存管理9.1.1 开发者背景人工内存管理和自动内存管理的比较n手工内存管理l程序员管理内存n手工内存管理中普遍存在的问题l释放内存失败l对已释放内存的无效引用n.NET 运行时提供的自动内存管理l减少编程风险l消除潜在的错误源9.1.2 人工内存管理和自动内存管理的比较.NET Framework 类型的内存管理n值类型的实例使用栈上的内存l自动且安全地进行分配和释放n引用类型的实例使用托管堆上的内存l用 New 操作符创建l通过垃圾回收来释放9.1.3 .NET Framework 类型的内存管理 简单垃圾回收n当系统内存空间不足以分配新的对象时,垃圾回 收开始n简单垃圾回收算法用下列步骤l等待直到托管代码线程处于安全状态l创建一个可到达对象的图l把可访问对象移动到紧凑堆中,不可访问对象的内 存被回收l更新所有对被移动对象的引用n对象间的循环引用被自动处理9.1.4 简单垃圾回收多媒体演示 简单垃圾回收第9章 内存和资源管理n内存管理基础n非内存资源管理n优化垃圾回收非内存资源管理n隐式资源管理n显式资源管理9.2 非内存资源管理隐式资源管理n终结 n带终结器的垃圾回收 n终结指导原则n控制垃圾回收9.2.1 隐式资源管理终结 n隐式资源管理确保对象在将来不再有任何有效引 用的时候可以完全清理它的资源n在 C# 中,终结代码由析构函数提供 n如下代码利用 C# 析构函数来隐式关闭文件流class Foo private System.IO.FileStream fs;/.public Foo() fs = new System.IO.FileStream(“bar“, FileMode.CreateNew);Foo() fs.Close(); 9.2.1 隐式资源管理终结 (续)n下列事件发生时终结器将被调用l当第 0 代中(即最年轻、最近分配的对象)的可用 内存不足以满足分配请求时发生第 0 代垃圾回收 l代码显式调用系统 GC 的 Collect 静态方法l公共语言运行库卸载应用程序域l公共语言运行库被关闭9.2.1 隐式资源管理带终结器的垃圾回收 n运行时维护一个具有终结器对象的列表l终止队列n当垃圾回收进程执行时l将不可访问而在终止队列中的引用放到准备终止队 列中l垃圾回收线程压缩托管堆l更新所有到被移动对象的引用9.2.1 隐式资源管理带终结器的垃圾回收(续)n当对象在终结时发生下列情况会使对象复活l终结代码中包含对其自身的引用l终结代码中包含对全局或静态变量的引用n终结线程在运行时会l执行准备终结对象的 Finalize 方法l将准备终结对象的引用从准备终止队列中去除l除非对象复活,这些对象被认为是废弃的l当垃圾回收器线程再次执行时,这些对象的内存可 以被回收9.2.1 隐式资源管理多媒体演示 垃圾回收终止指导原则n尽可能避免使用终结器,因为它会l降低系统性能l增加复杂性l延迟资源释放n如果确实需要终结器,则遵循下列原则l避免调用其他的对象l不要对线程的 ID作任何假设n带终结器的类应该l避免引用其他的对象9.2.1 隐式资源管理控制垃圾回收n强制垃圾回收n暂时挂起调用线程,直到终止队列为空 n允许已终结而又复活对象的 终结器再次被调用n请求系统不调用终结器void System.GC.Collect();void System.GC.WaitForPendingFinalizers(); void System.GC.ReRegisterForFinalize(obj as object); void System.GC.SuppressFinalize(obj as object);9.2.1 隐式资源管理显式资源管理nIDisposable 接口和 Dispose 方法n临时资源使用设计模式9.2.2 显式资源管理IDisposable 接口和 Dispose 方法n继承自 IDisposable 接口n实现 Dispose 方法n遵循 .NET Framework SDK 的设计模式class ResourceWrapper : IDisposable /详细内容参考教材中的示例代码 9.2.2 显式资源管理IDisposable 接口和 Dispose 方法(续)n显式资源管理的一些指导原则l当 Dispose 方法被调用后应该调用 GC. SuppressFinalize 方法来提高性能 l在整个继承体系内使用 Dispose 方法l不要假定 Dispose 方法已被调用,作为预防,应在终 结器中也释放资源l任何时候当类所依赖的资源已被释放掉后,调用 Dispose 方法会抛出 ObjectDisposedExceptionlDispose 方法可以被调用多次9.2.2 显式资源管理临时资源使用模式n临时资源使用 l使用 Try 和 Finally 分配、使用并处理资源l使用 using 表达式nTry and Finallyvoid DoSomething() Resource r = new Resource(.); try r.Foo(); finally if (r != null) (IDisposable)r).Dispose(); using (Resource r1 = new Resource() r1.Foo(); 9.2.2 显式资源管理第9章 内存和资源管理n内存管理基础n非内存资源管理n优化垃圾回收优化垃圾回收n弱引用n代n其他性能特性 9.3 优化垃圾回收弱引用n弱引用允许在内存缺少的情况下对象被回收9.3.1 弱引用Object obj = new Object(); /创建强引用 WeakReference wr = new WeakReference(obj); obj = null; /去除强引用 / . obj = (Object) wr.Target; if (obj != null) /垃圾回收还没有发生 / . else /对象被回收, 引用为 null /. 代n强制从0代到指定代进行垃圾回收n找出对象所属的代n返回系统支持的最大终结代数目9.3.2 代void System.GC.Collect(int Generation); Int32 System.GC.GetGeneration(Object obj); Int32 System.GC.MaxGeneration; 其他性能特性 n性能监视l实时取得内存活动的信息n大对象堆l超过20000个字节的对象被分配到大对象堆中 l大对象总是属于第2代,不会轻易被回收n多处理器支持l.NET 运行时提供了两个版本的垃圾回收器,服务器 版垃圾回收器和单机版垃圾回收器9.3.3 其他性能特性实验 内存和资源管理练习1 显式资源管理编程 练习2 隐式资源管理编程 回顾n描述垃圾回收器如何管理对象内存n通过终结器隐式管理非内存资源n显式管理非内存资源n用临时资源使用模式来编写代码n编程控制垃圾回收器的行为学习完本章后,将能够:
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号