第十七节:监视垃圾回收

在一个进程中,可以调用几个方法来监视垃圾回收器。具体的说,GC类提供了以下静态方法,可调用他们查看某一代发生了多少次垃圾回收,或者托管堆中的对象当前使用了多少内存。

public static long GetTotalMemory(bool forceFullCollection);

public static int CollectionCount(int generation);

为了评估一个特定的代码块的性能,我经常在这个代码块的前后写代码调用这些方法,并计算差异。这使我能很好的把握代码块对进程工作集的影响,并了解执行代码块时发生了多少次垃圾回收。如果这个数字太高,我就知道应该花更多的时间调整代码块中的算法了。

还可以了解单独的AppDomain使用了多少内存。

安装.NET Framework时,它会安装一组性能计数器,为CLR的操作提供大量实时统计数据。这些统计数据可以通过Window自带的PerfMon.exe工具或者“系统监视器”ActiveX控件来查看。为了访问“系统监视器”,最简单的方法时运行PerfMon.exe,单击+工具栏按钮,随后显示添加计数器对话框。

为了监视CLR的垃圾回收器,请选择”.NET clr memory”性能对象,然后再下方的实例列表中选择一个具体的应用程序。最后,选定向监视的计数器集合,单击”添加”,再“确定”,随后,“性能计数器”会显示实时统计数据。要想知道一个特定计数器的含义,选定计数器,然后勾选”显示描述”来获得该计数器的详细说明。

还有一个很出色的工具可监视应用程序的对象分配,它的名字是CLR Profiler。该工具提供了调用评估、堆快照以及内存使用时间线等功能。另外,该工具还提供了API,可在测试代码中利用这个API开始和停止评估,并在日志中插入注释。另外,该工具还提供了源代码,可根据自己的需要修改它。

最后,还可以研究一下SOS Debugging Extension(sos.dll)。调试内存问题或其他CLR问题时,它经常能提供出色的协助。对于内存有关的运行,SOS Debugging Extension 允许检查进程中为托管堆分配了多少内存,显示在终结队列中登记终结的所有对象,显示每个AppDomain或整个进程的GCHandle表中的记录项,并显示是什么根保持对象在堆中存活。

时间: 2024-10-08 05:49:23

第十七节:监视垃圾回收的相关文章

第十五节:垃圾回收模式

CLR启动时,会选择一种GC模式.在进程的生存期内,这个模式不能改变.有以下两种基本的GC模式. 1.工作站    这个模式为客户端应用程序优化垃圾回收器.垃圾回收器假定机器上运行的其它应用程序对CPU资源的要求不高.工作站模式有两个子模式:有并发回收器的工作站,以及无并发回收器的工作站. 2.服务器    这个模式为服务器端的应用程序优化垃圾回收.垃圾回收器假定机器上没有运行其它应用程序,并假定机器上所有CPU都是用来执行垃圾回收的.该GC模式造成托管堆被分成几个区域,每个CPU一个区域.开始

Java GC系列(4):垃圾回收监视和分析

在这个Java GC系列教程中,让我们学习用于垃圾回收监视和分析的工具.然后,选用一种工具来监视一个Java示例程序的垃圾回收过程.如果你是一名初学者,你最好仔细阅读该系列教程.你可以从这里(垃圾回收介绍)开始. Java GC监视和分析工具 下面是一些可用的工具,每个都有自己的优势和缺点.我们可以通过选择正确的工具并分析,来提升应用程序的性能.这篇教程中,我们选用Java VisualVM. Java VisualVM Naarad GCViewer IBM Pattern Modeling

Java 的垃圾回收机制(转)

先看一段转载,原文出自 http://jefferent.iteye.com/blog/1123677 虚拟机中的共划分为三个代:年轻代(Young Generation).年老点(Old Generation)和持久代(Permanent Generation).其中持久代主要存放的是Java类的类信息,与垃圾收集要收集的Java对象关系不大.年轻代和年老代的划分是对垃圾收集影响比较大的. 年轻代: 所有新生成的对象首先都是放在年轻代的.年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象.

垃圾回收GC:.Net自己主动内存管理 上(二)内存算法

垃圾回收GC:.Net自己主动内存管理 上(二)内存算法 垃圾回收GC:.Net自己主动内存管理 上(一)内存分配 垃圾回收GC:.Net自己主动内存管理 上(二)内存算法 垃圾回收GC:.Net自己主动内存管理 上(三)终结器 前言 .Net下的GC全然攻克了开发人员跟踪内存使用以及控制释放内存的窘态.然而,你或午想要理解GC是怎么工作的.此系列文章中将会解释内存资源是怎么被合理分配及管理的,并包括很具体的内在算法描写叙述.同一时候.还将讨论GC的内存清理流程及什么时清理,怎么样强制清理. 内

垃圾回收GC:.Net自动内存管理 上(二)内存算法

垃圾回收GC:.Net自动内存管理 上(二)内存算法 垃圾回收GC:.Net自动内存管理 上(一)内存分配 垃圾回收GC:.Net自动内存管理 上(二)内存算法 前言 .Net下的GC完全解决了开发者跟踪内存使用以及控制释放内存的窘态.然而,你或午想要理解GC是怎么工作的.此系列文章中将会解释内存资源是怎么被合理分配及管理的,并包含非常详细的内在算法描述.同时,还将讨论GC的内存清理流程及什么时清理,怎么样强制清理. 内存算法 GC检测用于查看堆中是否有对象不再被程序使用.如果这样的对象存在,这

【译】.Net 垃圾回收机制原理(转)

上一篇文章介绍了.Net 垃圾回收的基本原理和垃圾回收执行Finalize方法的内部机制:这一篇我们看下弱引用对象,代,多线程垃圾回收,大对象处理以及和垃圾回收相关的性能计数器. 让我们从弱引用对象说起,弱引用对象可以减轻大对象带来的内存压力. 弱引用(Weak References) 当程序的根对象指向一个对象时,这个对象是可达的,垃圾回收器不能回收它,这称为对对象的强引用.和强引用相对的是弱引用,当一个对象上存在弱引用时,垃圾回收器可以回收此对象,但是也允许程序访问这个对象.这是怎么回事儿呢

第十一节:用于本地资源的其它垃圾回收功能

有时,本地资源会消耗大量的内存,但是用于包装该资源的托管对象只占用了非常少的内存.一个典型的例子就是位图.一个位图可能占用几兆字节的本地内存,但是托管对象却极小,因为它只包含了一个hbitmap(一个4或8字节的值),从CLR角度看,一个进程可以在执行一次垃圾回收之前分配数百个位图(他们用的托管内存太少了).但是,如果进程操作许多位图,进程的内存消耗将以一个恐怖的速度增长.为了修正这个问题,GC类提供了以下两个静态方法: public static void AddMemoryPressure(

[CLR via C#]21. 自动内存管理(垃圾回收机制)

目录 理解垃圾回收平台的基本工作原理 垃圾回收算法 垃圾回收与调试 使用终结操作来释放本地资源 对托管资源使用终结操作 是什么导致Finalize方法被调用 终结操作揭秘 Dispose模式:强制对象清理资源 使用实现了Dispose模式的类型 C#的using语句 手动监视和控制对象的生存期 对象复活 代 线程劫持 大对象 一.理解垃圾回收平台的基本工作原理 值类型(含所有枚举类型).集合类型.String.Attribute.Delegate和Event所代表的资源无需执行特殊的清理操作.

java 垃圾回收机制和调优(转)Java Garbage Collection

(转)http://www.cnblogs.com/shudonghe/p/3457990.html 文主要介绍,JVM的组件,自动垃圾收集器是如何工作的,分代垃圾收集器的收集过程,使如何用Visual VM来监视应用的虚拟机,以及JVM中垃圾收集器的种类. 一.JVM架构 1.HotSpot 架构 HotSpot JVM架构支持较强的基本特征和功能,此外还支持高性能和高吞吐率的特性.例如,JVM JIT编译器产生动态优化的代码,亦即,编译器是在Java运行的时候的时候进行优化,并为当然的系统架