zoukankan      html  css  js  c++  java
  • !dumpheap –stat的解释(debugging .net leaks)

    到目前为止,!dumpheap 是调试托管内存泄漏时最强大的命令。它将向您显示托管堆上的所有对象,并使用的不同开关你可以用你想要的任何方式显示输出。
    !dumpheap是sos.dll框架安装附带的扩展(在framework目录中),如果安装了SDK,则可以在C:Program files Microsoft Visual Studio.NET2003SDKv1.1工具开发人员指南示例SoS中找到有关其使用的一些基本帮助。
    堆上存储有两种类型的对象。以某个地方为根的对象,即应用程序中的某个对象有指向它们的指针;自上次垃圾回收后已创建或取消根目录的对象。如果您想知道泄漏在哪里,并且希望避免查看大量即将被垃圾收集的数据,那么一个好方法是运行一个压力测试,然后通过调用GC.Collect(3) ,获取一个内存转储,然后再强调一点,再次诱导GC并获取另一个内存转储并比较堆上的对象。
    -stat开关(statistics)显示堆上每种类型的对象的摘要。

    0:000> !dumpheap -stat
    0x79c489a0 1 12 System.Runtime.Remoting.Messaging.ClientContextTerminatorSink
    0x79bf9aec 1 12 System.IO.TextReader/NullTextReader
    0x79be7078 1 12 System.Runtime.Remoting.Proxies.ProxyAttribute
    0x79bce8e0 1 12 System.Runtime.InteropServices.ComVisibleAttribute
    0x79bce7c8 1 12 System.CLSCompliantAttribute
    0x79bc08e0 1 12 System.Empty
    0x0618ae68 1 12 System.Web.Configuration.CustomErrorsConfigHandler
    0x061887f8 1 12 System.Web.UI.WebControls.UnitConverter
    0x06180848 1 12 System.Drawing.ColorConverter
    0x05dbfbc4 1 12 System.Data.Res
    
    <… cut to save space …>
    
    0x03f1236c 625 2,820,896 System.Char[]
    0x04ad88f4 102,874 2,880,472 System.Web.UI.ControlCollection
    0x0469bdf0 156,650 3,133,000 System.Collections.Specialized.HybridDictionary
    0x04ad91bc 164,516 3,290,320 System.Web.UI.Triplet
    0x03f134a8 7,582 3,799,704 System.Collections.Hashtable/bucket[]
    0x04ade5e4 47,395 4,549,920 System.Web.UI.WebControls.Label
    0x061826bc 58,197 4,888,548 System.Web.UI.DataBoundLiteralControl
    0x04adff44 323,119 5,169,904 System.Web.UI.StateItem
    0x0618788c 63,437 6,089,952 System.Web.UI.WebControls.TableCell
    0x0469c5c4 309,132 6,182,640 System.Collections.Specialized.ListDictionary/DictionaryNode
    0x0011cec0 305 6,240,720 Free
    0x79ba2ee4 270,831 6,499,944 System.Collections.ArrayList
    0x03f16d9c 222 7,703,284 System.DateTime[]
    0x04add34c 105,502 8,018,152 System.Web.UI.LiteralControl
    0x0615c6f4 558,019 11,160,380 System.Data.DataRowView
    0x03f15d1c 3,783 15,447,528 System.Boolean[]
    0x060bcc74 570,274 22,810,960 System.Data.DataRow
    0x03f15fd4 702 50,930,472 System.Decimal[]
    0x03f131e8 21,013 60,573,352 System.Int32[]
    0x03f1209c 508,734 75,399,184 System.Object[]
    0x79b94638 5,286,303 697,441,440 System.String
    Total 9,712,896 objects, Total size: 1,032,127,612

    第一列显示类型的方法表。如果您转储一个对象的实际数据,您会发现第一个DWORD是方法表,它包含指向有关该类型的信息的链接,例如它的成员变量是什么,它实现了什么方法等等。实际上,使用方法表,您可以唯一地标识类型。第二列列出了堆上这种类型的对象的数量,因此在上面的示例中,堆上有5286303个字符串。第3列显示了所有对象的总大小,因此在上面的示例中,我们的5286303字符串总共占用了大约695MB。但是,总大小是一个经过修改的事实,第3列显示的是对象结构的总大小,不包括成员变量。
    让我们拿一个System.Data.DataSet举例:

    0x060bbd2c 221 17,680 System.Data.DataSet

    这里我们可以看到221个数据集总共占用17680个字节,这意味着平均每个数据集占用80个字节。如果显示的是完整的数据集,那么这将是一个非常非常小的数据集。如果我们通过第一次运行!dumpheap–mt<methodtable>将数据集的内容转储到堆上,然后从结果列表中选择一个并运行!dumpobj<address>在上面我们将看到如下内容。

    0:000> !dumpobj 0x3920ed4c
    Name: System.Data.DataSet
    MethodTable 0x060bbd2c
    EEClass 0x060d2614
    Size 80(0x50) bytes
    GC Generation: 2
    mdToken: 0x0200003b (c:windowsassemblygacsystem.data1.0.5000.0__b77a5c561934e089system.data.dll)
    FieldDesc*: 0x060bb358
            MT Field Offset Type Attr Value Name
    0x060b252c 0x4000583 0x4 CLASS instance 0x00000000 site
    0x060b252c 0x4000584 0x8 CLASS instance 0x00000000 events
    0x060b252c 0x4000582 0 CLASS shared static EventDisposed
        >> Domain:Value 0x001192a0:NotInit 0x0017fc40:NotInit 0x044b7b28:0x1c357cb8 <<
    0x060bbd2c 0x40003d3 0xc CLASS instance 0x00000000 defaultViewManager
    0x060bbd2c 0x40003d4 0x10 CLASS instance 0x3920ee28 tableCollection
    0x060bbd2c 0x40003d5 0x14 CLASS instance 0x3920ed9c relationCollection
    0x060bbd2c 0x40003d6 0x18 CLASS instance 0x00000000 extendedProperties
    0x060bbd2c 0x40003d7 0x1c CLASS instance 0x1c357c90 dataSetName
    0x060bbd2c 0x40003d8 0x20 CLASS instance 0x182d0224 _datasetPrefix
    0x060bbd2c 0x40003d9 0x24 CLASS instance 0x182d0224 namespaceURI
    0x060bbd2c 0x40003da 0x40 System.Boolean instance 0 caseSensitive
    0x060bbd2c 0x40003db 0x28 CLASS instance 0x14309a0c culture
    0x060bbd2c 0x40003dc 0x41 System.Boolean instance 1 enforceConstraints
    0x060bbd2c 0x40003dd 0x42 System.Boolean instance 0 fInReadXml
    0x060bbd2c 0x40003de 0x43 System.Boolean instance 0 fInLoadDiffgram
    0x060bbd2c 0x40003df 0x44 System.Boolean instance 0 fTopLevelTable
    0x060bbd2c 0x40003e0 0x45 System.Boolean instance 0 fInitInProgress
    0x060bbd2c 0x40003e1 0x46 System.Boolean instance 1 fEnableCascading
    0x060bbd2c 0x40003e2 0x47 System.Boolean instance 0 fIsSchemaLoading
    0x060bbd2c 0x40003e3 0x2c CLASS instance 0x00000000 rowDiffId
    0x060bbd2c 0x40003e4 0x48 System.Boolean instance 0 fBoundToDocument
    0x060bbd2c 0x40003e5 0x30 CLASS instance 0x00000000 onPropertyChangingDelegate
    0x060bbd2c 0x40003e6 0x34 CLASS instance 0x00000000 onMergeFailed
    0x060bbd2c 0x40003e7 0x38 CLASS instance 0x00000000 onDataRowCreated
    0x060bbd2c 0x40003e8 0x3c CLASS instance 0x00000000 onClearFunctionCalled
    0x060bbd2c 0x40003e9 0 CLASS shared static zeroTables
        >> Domain:Value 0x
  • 相关阅读:
    C语言头文件stdarg.h(cstdarg)
    C语言头文件ctype.h(cctype)
    内存数库库种类
    C#设计模式单件模式(Singleton Pattern)
    vs2005快捷键,vs2008通用
    移动MYSQL数据库经常遇到乱码的问题
    ie6 ie7 ie8 共存以及Firefox浏览器CSS兼容写法
    用正则表达式替换a标记href值
    IE6 PNG透明终极解决方案(打造W3CfunsIE6PNG最强帖)
    IE的hack
  • 原文地址:https://www.cnblogs.com/yilang/p/13507518.html
Copyright © 2011-2022 走看看