CLR 完全介绍: 编写可靠的.NET代码

当我们谈论某样东西具有可靠性时,我们是指它值得信赖,而且可以预测。但是就软件而言,还必须具备其他重要属性,才可以说代码具有可靠性。

软件必须具有复原性,意思是说在出现内部和外部中断情况时,它仍然可以继续正常运行。它必须是可恢复的,以便它知道如何将自己恢复到先前已知的一致状态。软件必须可预测,这样它会提供及时的预期服务。它必须不可中断,意思是更改和升级都不会影响它的服务。最后,软件必须是生产就绪的,意思是它包含最少的 bug,并且只需要进行数量有限的更新。如果满足了这些条件,那么软件就真正称得上可靠了。

可靠代码的这些关键属性取决于不同的因素 — 有些取决于软件的整体体系结构,有些取决于将运行软件的操作系统,还有一些则取决于用来开发应用程序的工具和构建应用程序所基于的框架。复原能力是一种依赖于每一层的属性,应用程序的复原能力取决于其最薄弱的一环。

现在,请设想一下基于 Microsoft .NET Framework 的应用程序。这些应用程序委托运行时进行某些操作,这些操作在本机环境中不存在(例如 IL 代码的实时编译),或者已处于开发人员的直接控制之下(例如内存管理)。就可靠性而言,平台自身可以引入自己的故障点,这些故障点会影响在其上运行的应用程序的可靠性。了解这些故障可能在哪里发生以及可以使用什么样的技术来创建更可靠的基于 .NET 的应用程序非常重要。

了解运行时故障

某些异常事件在任何时候、任何代码段中都有可能发生。这些事件我们统称为异步异常,包括资源耗尽(内存不足和堆栈溢出)、线程终止和访问冲突。(在执行托管代码时,访问冲突会在运行时中发生。)

最后这个情形不是很有意义 — 如果确实发生了这样的事件,就意味着公共语言运行时 (CLR) 实现中发现了严重的 bug,应予以修复。但是对前两种情形,有必要进行进一步的分析。

理论上,我们会认为资源耗尽会得到运行时的妥善管理,并且它们绝不会影响应用程序代码继续运行的能力。可这只是理论,实际情况要复杂得多。

为了说明这个问题,我们首先来看一下某些常见的服务器应用程序如何处理内存不足 (OOM) 事件。对可用性要求很高的服务器应用程序(例如 ASP.NET 和 Exchange Server 2007)已通过 AppDomain 和进程回收达到了此目的。操作系统提供了非常强大的机制来清理内存和进程使用的大多数其他资源 — 所有这一切都在进程终止后完成。

就客户端而言,当内存压力达到即使很小的分配也会出现故障这种程度时,由于严重的超负荷和分页,会使整体系统进入一定程度上的无响应状态,导致用户宁愿去按重置按钮或者寻求任务管理器的帮助,也不愿意等待任何恢复代码的执行。从某种意义上说,用户的第一反应是手动执行 ASP.NET 或 Exchange 2007 会自动执行的同一个操作。

某些 OOM 甚至并不是由运行代码的任何特殊问题所引起的。运行在计算机上的其他进程或运行在该进程中的其他 AppDomain 可能会占用可用的资源池,并导致分配失败。从这种意义上说,应认为资源耗尽是异步的,因为它们在执行代码的任何时候都可能发生,并且它们可能依赖于运行代码外部和独立于运行代码的各种环境因素。

由于运行时可能会分配内存以执行与其自身运行相关的操作,因此该问题会变得更加严重。下面是几个发生在运行时的分配示例,它们在资源有限的环境中可能会发生故障:

装箱和取消装箱

延迟的类加载,直到第一次使用类为止

对 MarshalByRef 对象的远程操作

对字符串的某些操作

安全检查

JITing 方法

时间: 2024-12-10 10:23:28

CLR 完全介绍: 编写可靠的.NET代码的相关文章

编写可靠shell脚本的八个建议

这八个建议,来源于键者几年来编写 shell 脚本的一些经验和教训.事实上开始写的时候还不止这几条,后来思索再三,去掉几条无关痛痒的,最后剩下八条.毫不夸张地说,每条都是精挑细选的,虽然有几点算是老生常谈了. 1. 指定bash shell 脚本的第一行,#!之后应该是什么?如果拿这个问题去问别人,不同的人的回答可能各不相同. 我见过/usr/bin/env bash,也见过/bin/bash,还有/usr/bin/bash,还有/bin/sh,还有/usr/bin/env sh.这算是编程界的

编写可靠shell脚本的8个建议

这八个建议,来源于键者几年来编写 shell 脚本的一些经验和教训.事实上开始写的时候还不止这几条,后来思索再三,去掉几条无关痛痒的,最后剩下八条.毫不夸张地说,每条都是精挑细选的,虽然有几点算是老生常谈了. 1. 指定bash shell 脚本的第一行,#!之后应该是什么?如果拿这个问题去问别人,不同的人的回答可能各不相同. 我见过/usr/bin/env bash,也见过/bin/bash,还有/usr/bin/bash,还有/bin/sh,还有/usr/bin/env sh.这算是编程界的

《Visual Basic 2012入门经典》----1.7 编写界面后面的代码

1.7 编写界面后面的代码 Visual Basic 2012入门经典为使程序能够执行操作和响应用户交互,必须为程序编写代码.Visual Basic是一款事件驱动的语言,这意味着代码将响应事件而执行.事件可能来自用户,如用户单击按钮触发其Click事件:也可能来自Windows本身(对事件的完整解释请参见第4章).目前,该应用程序看起来不错,但并不能做任何事情.用户单击Select Picture按钮直到患上腕管综合症,也不会有什么事情发生,因为没有告诉程序当用户单击按钮时要做什么.现在按F5

erilog-用verilong语言编写一个走马灯的代码

问题描述 用verilong语言编写一个走马灯的代码 多模式LED发光控制器(Basys3)1)采用16个并排LED实现跑马灯发光器件:2)具有异步复位功能(按钮),复位时,LED全亮:3)模式选择(利用两位滑动开关):00-左循环跑马灯,01-右循环跑马灯,10-交叉闪烁跑马灯,11-全亮全灭闪烁4)速度选择(利用两位滑动开关):通过00-11实现四个速度等级的闪烁效果 解决方案 参考http://download.csdn.net/detail/xkdhdl/1745598http://ww

编写易读的代码

成功的开发团队要求队伍中的每一位成员遵守代码重用规则,这些规定把代码的重用性推到极至同时却不会显著降低开发人员的创造力和开发效率.如果编写和使用代码的开发人员遵守共同的程序命名规范代码和代码注释要求,那么代码的重用性就会得以大大提升.这些标准的起点是系统结构级的.你的功能规范应该在类.属性的名字.函数返回值以及其他关键程序元素的定义中反映这些标准.本文将就基本的命名规则和注释提出一些可行的建议,意图帮助读者开发自己的代码重用标准. 大小写标准 在我们开始讨论各类程序要素命名的正确方式之前,先让我

技术摘要:如何编写安全的Java代码

安全 摘要:本文是来自Sun官方站点的一篇关于如何编写安全的Java代码的指南,开发者在编写一般代码时,可以参照本文的指南 • 静态字段 • 缩小作用域 • 公共方法和字段 • 保护包 • equals方法 • 如果可能使对象不可改变 • 不要返回指向包含敏感数据的内部数组的引用 • 不要直接存储用户提供的数组 • 序列化 • 原生函数 • 清除敏感信息 静态字段 • 避免使用非final的公共静态变量 应尽可能地避免使用非final公共静态变量,因为无法判断代码有无权限改变这些变量值. • 一

CLR 完全介绍: “Orcas”中新增的库类

下一版本的 Microsoft .NET Framework(将随附当前代号为"Orcas"的下一版 Visual Studio 提供)的程序集分为两组,内部称为"red bits"和"green bits".red bits 包括先前在 .NET Framework 2.0 和 3.0 中提供的所有库(例如,mscorlib.dll 和 system.dll).为了确保使 Visual Studio"Orcas"具有高度的向

如何编写高效的android代码

 基于Android相关设备作为嵌入式设备范畴,在书写App应用的时候要格外关注效率,并且受电池电量的限制.这就导致嵌入式设备有诸多考虑.有限处理能力,因此就要求我们尽量去写高效的代码.本文讨论了很多能让开发者使他们的程序运行更有效的方法,遵照这些方法,你可以使你的程序发挥最大的效力.   引言   对于占用资源的系统,有两条基本原则:   不要做不必要的事   不要分配不必要的内存   所有下面的内容都遵照这两个原则.   1.避免建立对象   世界上没有免费的对象.虽然GC为每个线程都建立了

c++ 课设 c++编程问题-怎么编写这个界面和代码。c++的

问题描述 怎么编写这个界面和代码.c++的 第1题 地铁出行帮助软件 [问题描述] 当今的北京,地铁已经成为绝大多数人出行的首选.截至2014年1月,北京地铁共有17条运营线路.组成覆盖北京市11个市辖区,拥有231座运营车站.总长467千米运营线路的轨道交通系统,工作日均客流约1000万人次,峰值日客运量1155.92万人次.随着地铁线路的增加,地铁规模越来越大,人们愈发的感觉到地铁的便利.特别地从出发地到目的地的乘车方案的选择也越来越多.因此,需要提供一个软件能够为人们提供出发到目的地之间"