下载此文档

垃圾回收器基础与性能提示-Microsoft.doc


文档分类:IT计算机 | 页数:约10页 举报非法文档有奖
1/10
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/10 下载此文档
文档列表 文档介绍
垃圾回收器基础与性能提示
发布日期: 6/28/2004 | 更新日期: 6/28/2004
Rico Mariani
Microsoft Corporation
摘要:.NET 垃圾回收器为高速的分配服务提供了很好的内存使用机制,并且不会带来长期碎片的问题。本文解释了垃圾回收器的工作原理,然后讨论了在垃圾回收环境中可能遇到的某些性能问题。
适用于:
Microsoft .NET 框架
本页内容
简介
简化模型
回收垃圾
性能
终结
小结
简介
为了了解如何成功利用垃圾回收器,以及在垃圾回收环境中运行时可能遇到的性能问题,那么了解垃圾回收器如何工作的基础知识,以及这些内部操作对正在运行的程序会产生怎样的影响就显得十分重要。
本文分为两个部分:首先,我将使用简化模型概括地讨论公共语言运行库(CLR) 的垃圾回收器的性质,然后,我将讨论这种结构对性能的潜在影响。
返回页首
简化模型
出于解释性目的,请考虑下面的托管堆的简化模型。注意,这并不是实际实现的模型。
图 1. 托管堆的简化模型
下面是该简化模型的规则:

所有可进行垃圾回收的对象都分配在一个连续的地址空间范围内。

堆被划分为代(generation)(稍后介绍此概念),以便只需查找堆的一小部分就能清除大多数垃圾。

代中的对象大体上均为同龄。

代的编号越高,表示堆的这一片区域所包含的对象越老—这些对象就越有可能是稳定的。最老的对象位于最低的地址内,而新的对象则创建在增加的地址内。(在上面的图 1 中,地址是递增的。)

新对象的分配指针标记了内存的已使用(已分配)内存区域和未使用(可用)内存区域之间的边界。

通过删除死对象并将活对象转移到堆的低地址末尾,堆周期性地进行压缩。这就扩展了在创建新对象的图表底部的未使用区域。

对象在内存中的顺序仍然是创建它们的顺序,以便于定位。

在堆中,对象之间永远不会有任何空隙。

只有某些可用空间是已提交的。需要时,操作系统会从“保留的”地址范围中分配更多的内存。
返回页首
回收垃圾
需要了解的最容易的一种回收是完全压缩垃圾回收,所以我首先讨论它。
完全回收
在完全回收中,我们必须停止执行程序,并到 GC 堆中找到所有根。这些根以各种形式出现,但大多数明显是堆栈和指向堆中的全局变量。从根开始,我们访问每个对象,并沿途追溯包含在每个被访问对象内的每个对象指针,指针用于标记这些对象。以这种方式,回收器将发现每个
可达到的或活的对象。而其他对象(不可达到对象)现在会被宣告死亡。
图 2. GC 堆中的根
一旦找出了不可达到的对象,我们就需要回收空间以便随后使用;在这里,回收器的目标是要将活的对象向上移动,并清除浪费的空间。在执行过程停止的情况下,回收器可以安全地移动所有这些对象,并修复所有指针,以便所有对象在新的位置上被正确链接。幸存的对象将被提升到下一代的编号(就是说,代的边界得到更新),并且执行过程可以恢复。
部分回收
遗憾的是,每次都执行完全垃圾回收确实开销太大,所以,现在可以讨论如何在回收过程中使用代来帮助我们解决问题。
首先让我们考虑一种假想的情形(此例中,我们特别幸运)。假设最近执行了一次完全回收,并且堆得到了很好的压缩。程序继

垃圾回收器基础与性能提示-Microsoft 来自淘豆网m.daumloan.com转载请标明出处.

相关文档 更多>>
非法内容举报中心
文档信息
  • 页数10
  • 收藏数0 收藏
  • 顶次数0
  • 上传人dlmus1
  • 文件大小212 KB
  • 时间2017-08-19