• 三个关键命令找出ASP.NET程序内存分片的原因


    最近一位朋友的ASP.NET程序怀疑有内存泄露问题。几个简单的页面,起来运行几分钟后,虚拟内存就到600多MB。从性能监视上看,private bytes只有200多MB。

    这样的问题从经验上来说,十有八九都是内存碎片了。ASP.NET程序发生内存碎片的原因比较多,我常见的有:


    1. Web.config中的debug=true,导致batch compilation=false,使得每一个ASPX页面都生成一个临时assembly。当页面比较多的时候,大量的assembly导致内存泄露。
    2. 程序中误用了XmlSerializer。频繁的XML序列化导致大量的动态assembly
    3. 程序中有大量的blocking IO操作,而且IO buffer没有及时释放。比如程序中有大量的Web Service调用,但是对方web service返回比较慢,使得调用程序中用来接收web service结果的小块buffer大量堆积,导致内存泄露

    下面是我拿到dump后的分析步骤。对于managed程序,找出问题的大致线索还是挺简单的。


    (随便无耻地推销下,《Windows高效排错》书中对这样的问题有更多的讨论。包括更多的案例和命令解释。该书最初的PDF草稿在http://www.cnblogs.com/lixiong/archive/2006/08/16/475520.html。如果有朋友从这个PDF中找到过排错的灵感,麻烦也帮忙无耻推销下。)


    首先是看看CLR的版本了。这个直接看mscorwks文件或者mscorsrv文件。如果文件版本比较低,后面的就没必要仔细看了,升级CLR补丁后再说。


    0:000> lmvm mscorwks
    start    end        module name
    79e70000 7a3d6000   mscorwks   (deferred)            
        Image path: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll
        Image name: mscorwks.dll
        Timestamp:        Fri Apr 13 15:15:54 2007 (461F2E2A)
        CheckSum:         00564CA8
        ImageSize:        00566000
        File version:     2.0.50727.832
        Product version:  2.0.50727.832
        File flags:       0 (Mask 3F)
        File OS:          4 Unknown Win32
        File type:        2.0 Dll
        File date:        00000000.00000000
        Translations:     0409.04b0
        CompanyName:      Microsoft Corporation
        ProductName:      Microsoft® .NET Framework
        InternalName:     mscorwks.dll
        OriginalFilename: mscorwks.dll
        ProductVersion:   2.0.50727.832
        FileVersion:      2.0.50727.832 (QFE.050727-8300)

        FileDescription:  Microsoft .NET Runtime Common Language Runtime - WorkStation
        LegalCopyright:   © Microsoft Corporation.  All rights reserved.
        Comments:         Flavor=Retail

    恩,版本还是比较新的。既然是内存问题,先看GC中有多少object,占用了多少内存

    0:000> !eeheap -gc
    Number of GC Heaps: 4
    ------------------------------
    Heap 0 (000f3f10)
    generation 0 starts at 0x02fad2fc
    generation 1 starts at 0x02f83ff8
    generation 2 starts at 0x02f00038
    ephemeral segment allocation context: none
     segment    begin allocated     size
    00109198 7a72c42c  7a74d308 0x00020edc(134876)
    000fdfb0 790d5588  790f4b38 0x0001f5b0(128432)
    02f00000 02f00038  03081450 0x00181418(1578008)
    Large object heap starts at 0x12f00038
     segment    begin allocated     size
    12f00000 12f00038  131b00a0 0x002b0068(2818152)
    Heap Size  0x47190c(4659468)
    ------------------------------
    Heap 1 (000f50a0)
    generation 0 starts at 0x06f5b110
    generation 1 starts at 0x06f5acf8
    generation 2 starts at 0x06f00038
    ephemeral segment allocation context: none
     segment    begin allocated     size
    06f00000 06f00038  06ff511c 0x000f50e4(1003748)
    Large object heap starts at 0x14f00038
     segment    begin allocated     size
    14f00000 14f00038  14f00048 0x00000010(16)
    Heap Size   0xf50f4(1003764)
    ------------------------------
    Heap 2 (000f68a0)
    generation 0 starts at 0x0af78634
    generation 1 starts at 0x0af09d40
    generation 2 starts at 0x0af00038
    ephemeral segment allocation context: none
     segment    begin allocated     size
    0af00000 0af00038  0af92a0c 0x000929d4(600532)
    Large object heap starts at 0x16f00038
     segment    begin allocated     size
    16f00000 16f00038  16f00048 0x00000010(16)
    Heap Size   0x929e4(600548)
    ------------------------------
    Heap 3 (000f7bc8)
    generation 0 starts at 0x0ef7b270
    generation 1 starts at 0x0ef7b264
    generation 2 starts at 0x0ef00038
    ephemeral segment allocation context: none
     segment    begin allocated     size
    0ef00000 0ef00038  0ef7d27c 0x0007d244(512580)
    Large object heap starts at 0x18f00038
     segment    begin allocated     size
    18f00000 18f00038  18f00048 0x00000010(16)
    Heap Size   0x7d254(512596)
    ------------------------------
    GC Heap Size  0x676638(6776376)

    内存占用只有6M,显然不是CLR object导致的问题。那看来真的就是内存碎片了。于是先看看程序中有多少DLL:
    0:000> lmf
    start    end        module name
    00900000 00bc5000   xpsp2res C:\WINDOWS\system32\xpsp2res.dll
    01000000 01005000   w3wp     c:\WINDOWS\system32\inetsrv\w3wp.exe
    1b740000 1b748000   App_global_asax_incckcvw C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\b972f933\24c4c459\App_global.asax.incckcvw.dll
    1b770000 1b790000   Boke_WebRoot_Admin C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\b972f933\24c4c459\assembly\dl3\0854db20\0aaa279d_a314c801\Boke.WebRoot.Admin.DLL
    1b7e0000 1b820000   log4net  C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\b972f933\24c4c459\assembly\dl3\8af1019b\00a071ef_de00c801\log4net.DLL
    1bb00000 1bb0e000   App_Web_fsrghzyk C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\b972f933\24c4c459\App_Web_fsrghzyk.dll
    1bb20000 1bb30000   AspNetPager C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\b972f933\24c4c459\assembly\dl3\53ce5ce1\00a071ef_de00c801\AspNetPager.DLL
    1bb30000 1bb3c000   App_Web_qenznn_e C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\b972f933\24c4c459\App_Web_qenznn_e.dll
    1bb60000 1bb70000   UDMap    D:\webfolder\dvdvAdmin\bin\Map.dll
    50210000 5025c000   SMDiagnostics_ni C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\SMDiagnostics\da4366daf8361c62ed3fcec4c55fa9ca\SMDiagnostics.ni.dll
    50270000 50368000   System_IdentityModel_ni C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\System.IdentityModel\bc31a40dee949687576d5395efcab6a0\System.IdentityModel.ni.dll
    504e0000 50728000   System_Runtime_Serialization_ni C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\System.Runtime.Seri#\c861896fa11d6eef9fed23cff7b77b01\System.Runtime.Serialization.ni.dll
    507a0000 5185e000   System_ServiceModel_ni C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\System.ServiceModel\719a7cce9b36b780b3edd9869ceb2537\System.ServiceModel.ni.dll
    5a300000 5a307000   w3tp     c:\WINDOWS\system32\inetsrv\w3tp.dll
    5a320000 5a332000   w3isapi  c:\WINDOWS\system32\inetsrv\w3isapi.dll
    5a360000 5a36d000   w3dt     c:\WINDOWS\system32\inetsrv\w3dt.dll
    5a390000 5a3e8000   w3core   c:\WINDOWS\system32\inetsrv\w3core.dll
    5a3f0000 5a3f6000   w3comlog c:\WINDOWS\system32\inetsrv\w3comlog.dll
    5a400000 5a408000   w3cache  c:\WINDOWS\system32\inetsrv\w3cache.dll
    5a420000 5a431000   iismap   C:\WINDOWS\system32\iismap.dll
    5b640000 5b658000   strmfilt C:\WINDOWS\system32\strmfilt.dll
    5e620000 5e6da000   Microsoft_JScript C:\WINDOWS\assembly\GAC_MSIL\Microsoft.JScript\8.0.0.0__b03f5f7f11d50a3a\Microsoft.JScript.dll
    5f270000 5f2ca000   hnetcfg  C:\WINDOWS\system32\hnetcfg.dll
    60060000 60066000   aspnet_filter C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_filter.dll
    60070000 60075000   aspnet_isapi \\?\c:\WINDOWS\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll
    608f0000 60901000   admwprox C:\WINDOWS\system32\admwprox.dll
    60ba0000 60bb1000   wamreg   c:\WINDOWS\system32\inetsrv\wamreg.dll
    62da0000 62da7000   lonsint  c:\WINDOWS\system32\inetsrv\lonsint.dll
    637a0000 63d02000   System_Xml_ni C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\System.Xml\e342cc4334d3ab13ce752de73164c01b\System.Xml.ni.dll
    64700000 6472d000   iisutil  c:\WINDOWS\system32\inetsrv\iisutil.dll
    647b0000 647d7000   iisrtl   C:\WINDOWS\system32\iisrtl.dll
    64890000 6498a000   System_Configuration_ni C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\System.Configuration\edc1f15b90b2c6a4dc59b305f14bb98d\System.Configuration.ni.dll
    64e70000 6513c000   System_Data C:\WINDOWS\assembly\GAC_32\System.Data\2.0.0.0__b77a5c561934e089\System.Data.dll
    65140000 657a6000   System_Data_ni C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\System.Data\42481d9f835b4b6c150c50d2642781b9\System.Data.ni.dll
    65f20000 66ac6000   System_Web_ni C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\System.Web\83c662f1a20af1b2deea3f9a040ccbd6\System.Web.ni.dll
    67150000 67159000   httpapi  C:\WINDOWS\system32\httpapi.dll
    68000000 68035000   rsaenh   C:\WINDOWS\system32\rsaenh.dll
    685b0000 685ba000   gzip     C:\WINDOWS\system32\inetsrv\gzip.dll
    695a0000 697da000   System_Web_Mobile_ni C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\System.Web.Mobile\e7d2fee1612b52a914d8d253d5e49a7c\System.Web.Mobile.ni.dll
    69890000 698d0000   System_Web_RegularExpressions_ni C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\System.Web.RegularE#\1fa927a42b36176da2cdc193f0435950\System.Web.RegularExpressions.ni.dll
    6a2a0000 6a307000   webengine \\?\c:\WINDOWS\microsoft.net\framework\v2.0.50727\webengine.dll
    6d0f0000 6d110000   iisres   c:\WINDOWS\system32\inetsrv\iisres.dll
    71640000 7180d000   acgenral C:\WINDOWS\AppPatch\acgenral.dll
    71ae0000 71ae8000   wshtcpip C:\WINDOWS\system32\wshtcpip.dll
    71af0000 71b12000   shimeng  C:\WINDOWS\system32\shimeng.dll
    71b20000 71b61000   mswsock  C:\WINDOWS\system32\mswsock.dll
    71b70000 71ba6000   uxtheme  C:\WINDOWS\system32\uxtheme.dll
    71bb0000 71bb9000   wsock32  C:\WINDOWS\system32\wsock32.dll
    71bd0000 71be1000   mpr      C:\WINDOWS\system32\mpr.dll
    71bf0000 71bf8000   ws2help  C:\WINDOWS\system32\ws2help.dll
    71c00000 71c17000   ws2_32   C:\WINDOWS\system32\ws2_32.dll
    71c40000 71c97000   netapi32 C:\WINDOWS\system32\netapi32.dll
    745e0000 7489e000   msi      C:\WINDOWS\system32\msi.dll
    75490000 754f5000   usp10    C:\WINDOWS\system32\usp10.dll
    75e60000 75e87000   apphelp  C:\WINDOWS\system32\apphelp.dll
    76190000 761a2000   msasn1   C:\WINDOWS\system32\msasn1.dll
    761b0000 76243000   crypt32  C:\WINDOWS\system32\crypt32.dll
    76290000 762ad000   imm32    C:\WINDOWS\system32\imm32.dll
    76920000 769e2000   userenv  C:\WINDOWS\system32\userenv.dll
    76aa0000 76acd000   winmm    C:\WINDOWS\system32\winmm.dll
    76b70000 76b7b000   psapi    C:\WINDOWS\system32\psapi.dll
    76c90000 76cb7000   msv1_0   C:\WINDOWS\system32\msv1_0.dll
    76cf0000 76d0a000   iphlpapi C:\WINDOWS\system32\iphlpapi.dll
    76e30000 76e3c000   rtutils  C:\WINDOWS\system32\rtutils.dll
    76e40000 76e52000   rasman   C:\WINDOWS\system32\rasman.dll
    76e60000 76e8f000   tapi32   C:\WINDOWS\system32\tapi32.dll
    76e90000 76ecf000   rasapi32 C:\WINDOWS\system32\rasapi32.dll
    76ed0000 76efa000   dnsapi   C:\WINDOWS\system32\dnsapi.dll
    76f10000 76f3e000   wldap32  C:\WINDOWS\system32\wldap32.dll
    76f50000 76f63000   secur32  C:\WINDOWS\system32\secur32.dll
    76f70000 76f77000   winrnr   C:\WINDOWS\system32\winrnr.dll
    76f80000 76f85000   rasadhlp C:\WINDOWS\system32\rasadhlp.dll
    77010000 770d6000   comres   C:\WINDOWS\system32\comres.dll
    77380000 77411000   user32   C:\WINDOWS\system32\user32.dll
    77420000 77523000   comctl32 C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.3790.3959_x-ww_D8713E55\comctl32.dll
    77670000 777a9000   ole32    C:\WINDOWS\system32\ole32.dll
    777b0000 77833000   clbcatq  C:\WINDOWS\system32\clbcatq.dll
    77b70000 77b84000   msacm32  C:\WINDOWS\system32\msacm32.dll
    77b90000 77b98000   version  C:\WINDOWS\system32\version.dll
    77ba0000 77bfa000   msvcrt   C:\WINDOWS\system32\msvcrt.dll
    77c00000 77c48000   gdi32    C:\WINDOWS\system32\gdi32.dll
    77c50000 77cef000   rpcrt4   C:\WINDOWS\system32\rpcrt4.dll
    77d00000 77d8b000   oleaut32 C:\WINDOWS\system32\oleaut32.dll
    77da0000 77df2000   shlwapi  C:\WINDOWS\system32\shlwapi.dll
    77e00000 77e21000   ntmarta  C:\WINDOWS\system32\ntmarta.dll
    77e40000 77f42000   kernel32 C:\WINDOWS\system32\kernel32.dll
    77f50000 77feb000   advapi32 C:\WINDOWS\system32\advapi32.dll
    78130000 781cb000   msvcr80  C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0DE06ACD\msvcr80.dll
    79000000 79045000   mscoree  C:\WINDOWS\system32\mscoree.dll
    79060000 790b3000   mscorjit C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorjit.dll
    790c0000 79b90000   mscorlib_ni C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\mscorlib\56cbcbd518a77421a852a37b61624936\mscorlib.ni.dll
    79e70000 7a3d6000   mscorwks C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll
    7a440000 7ac06000   System_ni C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\System\19aba12bb5350aa99107e93bafbb4f51\System.ni.dll
    7ade0000 7af6c000   System_Drawing_ni C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\System.Drawing\e3104e1713757f14b54b7835be2a0e26\System.Drawing.ni.dll
    7c800000 7c8c0000   ntdll    C:\WINDOWS\system32\ntdll.dll
    7c8d0000 7d0ce000   shell32  C:\WINDOWS\system32\shell32.dll
    7e020000 7e02f000   samlib   C:\WINDOWS\system32\samlib.dll
    7f000000 7f009000   lpk      C:\WINDOWS\system32\lpk.dll

    非常普通。也就这点DLL,根本没有导致内存碎片的潜力呀!不死心,看看是不是有很多线程被block住了。要是有个几百个线程,嘿嘿
    0:000> ~
    .  0  Id: 694.540 Suspend: 1 Teb: 7ffdd000 Unfrozen
       1  Id: 694.12a0 Suspend: 1 Teb: 7ffdb000 Unfrozen
       2  Id: 694.1040 Suspend: 1 Teb: 7ffda000 Unfrozen
       3  Id: 694.11f0 Suspend: 1 Teb: 7ffd9000 Unfrozen
       4  Id: 694.13d0 Suspend: 1 Teb: 7ffd7000 Unfrozen
       5  Id: 694.1338 Suspend: 1 Teb: 7ffd6000 Unfrozen
       6  Id: 694.10e4 Suspend: 1 Teb: 7ffd5000 Unfrozen
       7  Id: 694.e4c Suspend: 1 Teb: 7ffd4000 Unfrozen
       8  Id: 694.10a8 Suspend: 1 Teb: 7ffd3000 Unfrozen
       9  Id: 694.1144 Suspend: 1 Teb: 7ff9f000 Unfrozen
      10  Id: 694.1340 Suspend: 1 Teb: 7ff9e000 Unfrozen
      11  Id: 694.1484 Suspend: 1 Teb: 7ff9d000 Unfrozen
      12  Id: 694.1170 Suspend: 1 Teb: 7ff9c000 Unfrozen
      13  Id: 694.11d8 Suspend: 1 Teb: 7ff9b000 Unfrozen
      14  Id: 694.1768 Suspend: 1 Teb: 7ff9a000 Unfrozen
      15  Id: 694.173c Suspend: 1 Teb: 7ff99000 Unfrozen
      16  Id: 694.a80 Suspend: 1 Teb: 7ff98000 Unfrozen
      17  Id: 694.500 Suspend: 1 Teb: 7ff97000 Unfrozen
      18  Id: 694.1194 Suspend: 1 Teb: 7ff96000 Unfrozen
      19  Id: 694.16c8 Suspend: 1 Teb: 7ff95000 Unfrozen
      20  Id: 694.162c Suspend: 1 Teb: 7ff94000 Unfrozen
      21  Id: 694.a8c Suspend: 1 Teb: 7ff93000 Unfrozen
      22  Id: 694.ad4 Suspend: 1 Teb: 7ff92000 Unfrozen
      23  Id: 694.1098 Suspend: 1 Teb: 7ff2f000 Unfrozen
      24  Id: 694.b08 Suspend: 1 Teb: 7ff2e000 Unfrozen
      25  Id: 694.19c Suspend: 1 Teb: 7ff90000 Unfrozen
      26  Id: 694.fcc Suspend: 1 Teb: 7ff2d000 Unfrozen
      27  Id: 694.764 Suspend: 1 Teb: 7ff91000 Unfrozen
      28  Id: 694.1334 Suspend: 1 Teb: 7ff2b000 Unfrozen

    。。。线程也这么少,怎么办

    还是不死心。从上面的DLL看到,程序中的模块要么系统的,要么CLR的,没有COM/COM+,问题应该还是在CLR相关的东西上。于是用!eeheap –loader看看loader heap的大小:

    0:000> !eeheap -loader
    Loader Heap:
    --------------------------------------
    System Domain: 7a38f918
    LowFrequencyHeap: Size: 0x0(0)bytes.
    HighFrequencyHeap: 02e72000(8000:1000) Size: 0x1000(4096)bytes.
    StubHeap: 02e7a000(2000:2000) 1b5b0000(10000:4000) Size: 0x6000(24576)bytes.
    Virtual Call Stub Heap:
      IndcellHeap: Size: 0x0(0)bytes.
      LookupHeap: Size: 0x0(0)bytes.
      ResolveHeap: Size: 0x0(0)bytes.
      DispatchHeap: Size: 0x0(0)bytes.
      CacheEntryHeap: Size: 0x0(0)bytes.
    Total size: 0x7000(28672)bytes
    --------------------------------------
    Shared Domain: 7a38fef0
    LowFrequencyHeap: 02ea0000(2000:1000) 1b6d0000(10000:d000) Size: 0xe000(57344)bytes.
    Wasted: 0x1000(4096)bytes.
    HighFrequencyHeap: 02ea2000(8000:5000) Size: 0x5000(20480)bytes.
    StubHeap: 02eaa000(2000:1000) 1bc80000(10000:1000) Size: 0x2000(8192)bytes.
    Wasted: 0x1000(4096)bytes.
    Virtual Call Stub Heap:
      IndcellHeap: 02eb0000(2000:1000) Size: 0x1000(4096)bytes.
      LookupHeap: 02eb5000(2000:1000) Size: 0x1000(4096)bytes.
      ResolveHeap: 02ebb000(5000:5000) 1bc10000(10000:2000) Size: 0x7000(28672)bytes.
      DispatchHeap: 02eb7000(4000:3000) Size: 0x3000(12288)bytes.
      CacheEntryHeap: 02eb2000(3000:1000) Size: 0x1000(4096)bytes.
    Total size: 0x21000(135168)bytes
    --------------------------------------
    Domain 1: ded80
    LowFrequencyHeap: 02e80000(2000:1000) Size: 0x1000(4096)bytes.
    HighFrequencyHeap: 02e82000(8000:4000) Size: 0x4000(16384)bytes.
    StubHeap: Size: 0x0(0)bytes.
    Virtual Call Stub Heap:
      IndcellHeap: Size: 0x0(0)bytes.
      LookupHeap: Size: 0x0(0)bytes.
      ResolveHeap: Size: 0x0(0)bytes.
      DispatchHeap: Size: 0x0(0)bytes.
      CacheEntryHeap: Size: 0x0(0)bytes.
    Total size: 0x5000(20480)bytes
    --------------------------------------
    Domain 2: 113b60
    LowFrequencyHeap: 1b550000(2000:2000) 1b760000(10000:f000) 1b830000(10000:10000) 1bcd0000(10000:f000) 1c150000(10000:10000) 1c260000(10000:10000) 1c300000(10000:10000) 1c380000(10000:10000) 1c430000(10000:10000) 1c510000(10000:10000) 1c5c0000(10000:10000) 1c6b0000(10000:10000) 1c750000(10000:10000) 1c800000(10000:f000) 1c8b0000(10000:f000) 1c920000(10000:10000) ……
    1db30000(10000:f000) 1dbc0000(10000:f000) 1dca0000(10000:f000) 1dd50000(10000:10000) 1de00000(10000:10000) 1de90000(10000:10000) 1df40000(10000:10000) 1dfb0000(10000:10000) 1df90000(10000:f000) 1e0e0000(10000:f000) 1e180000(10000:10000) 1e230000(10000:10000) 1e2d0000(10000:10000) 1e370000(10000:10000) 1e420000(10000:f000) 1e4b0000(10000:f000) 1e550000(10000:f000) 1e600000(10000:10000) 1e6b0000(10000:10000) 1e740000(10000:10000) 1e7f0000(10000:10000) 1e8e0000(10000:10000) 1eb60000(10000:f000) 1ec10000(10000:f000) 1ed30000(10000:10000) 1eda0000(10000:10000) 1ee40000(10000:c000) Size: 0x447000(4485120)bytes.
    Wasted: 0x17000(94208)bytes.
    HighFrequencyHeap: 1b552000(8000:8000) 1b820000(10000:f000) 1bb80000(10000:10000) 1c120000(10000:10000) 1c230000(10000:f000) 1c2d0000(10000:10000) 1c390000(10000:10000) 1c460000(10000:10000) 1c570000(10000:10000) 1c610000(10000:10000) 1c720000(10000:f000) 1c7d0000(10000:10000) ……
    1dd20000(10000:10000) 1ddf0000(10000:10000) 1dea0000(10000:10000) 1df20000(10000:f000) 1df30000(10000:10000) 1e080000(10000:10000) 1e150000(10000:10000) 1e220000(10000:10000) 1e2e0000(10000:10000) 1e3b0000(10000:f000) 1e450000(10000:10000) 1e500000(10000:10000) 1e5d0000(10000:10000) 1e6a0000(10000:10000) 1e750000(10000:10000) 1e860000(10000:f000) 1e910000(10000:10000) 1ebb0000(10000:10000) 1ec80000(10000:10000) 1ed90000(10000:10000) 1ee50000(10000:9000) Size: 0x3b8000(3899392)bytes.
    Wasted: 0x9000(36864)bytes.
    StubHeap: 1b55a000(2000:1000) Size: 0x1000(4096)bytes.
    Virtual Call Stub Heap:
      IndcellHeap: 1b5a0000(3000:1000) Size: 0x1000(4096)bytes.
      LookupHeap: 1b5a6000(3000:1000) Size: 0x1000(4096)bytes.
      ResolveHeap: 1b5ac000(4000:1000) Size: 0x1000(4096)bytes.
      DispatchHeap: 1b5a9000(3000:1000) Size: 0x1000(4096)bytes.
      CacheEntryHeap: 1b5a3000(3000:1000) Size: 0x1000(4096)bytes.
    Total size: 0x804000(8404992)bytes
    --------------------------------------
    Jit code heap:
    LoaderCodeHeap: 1ee10000(10000:c000) Size: 0xc000(49152)bytes.
    LoaderCodeHeap: 1ed60000(10000:10000) Size: 0x10000(65536)bytes.
    LoaderCodeHeap: 1ebe0000(10000:10000) Size: 0x10000(65536)bytes.
    LoaderCodeHeap: 1e8d0000(10000:10000) Size: 0x10000(65536)bytes.
    LoaderCodeHeap: 1e7a0000(10000:10000) Size: 0x10000(65536)bytes.
    LoaderCodeHeap: 1e690000(10000:10000) Size: 0x10000(65536)bytes.
    LoaderCodeHeap: 1e5a0000(10000:10000) Size: 0x10000(65536)bytes.
    LoaderCodeHeap: 1e4a0000(10000:10000) Size: 0x10000(65536)bytes.
    LoaderCodeHeap: 1e3a0000(10000:10000) Size: 0x10000(65536)bytes.
    ……
    LoaderCodeHeap: 1cb70000(10000:10000) Size: 0x10000(65536)bytes.
    LoaderCodeHeap: 1ca50000(10000:10000) Size: 0x10000(65536)bytes.
    LoaderCodeHeap: 1c980000(10000:10000) Size: 0x10000(65536)bytes.
    LoaderCodeHeap: 1c870000(10000:10000) Size: 0x10000(65536)bytes.
    LoaderCodeHeap: 1c780000(10000:10000) Size: 0x10000(65536)bytes.
    LoaderCodeHeap: 1c640000(10000:10000) Size: 0x10000(65536)bytes.
    LoaderCodeHeap: 1c540000(10000:10000) Size: 0x10000(65536)bytes.
    LoaderCodeHeap: 1c400000(10000:10000) Size: 0x10000(65536)bytes.
    LoaderCodeHeap: 1c330000(10000:10000) Size: 0x10000(65536)bytes.
    LoaderCodeHeap: 1c1c0000(10000:10000) Size: 0x10000(65536)bytes.
    LoaderCodeHeap: 1bce0000(10000:10000) Size: 0x10000(65536)bytes.
    LoaderCodeHeap: 1bc70000(10000:1000) Size: 0x1000(4096)bytes.
    HostCodeHeap: 1bc60000 Size: 0xa000(40960)bytes.
    LoaderCodeHeap: 1b7d0000(10000:10000) Size: 0x10000(65536)bytes.
    Total size: 0x2d7000(2977792)bytes
    --------------------------------------
    Module Thunk heaps:
    Module 50224000: Size: 0x0(0)bytes.
    Module 505c4000: Size: 0x0(0)bytes.
    Module 648ec000: Size: 0x0(0)bytes.
    Module 6638c000: Size: 0x0(0)bytes.
    Module 7a71e000: Size: 0x0(0)bytes.
    Module 502c2000: Size: 0x0(0)bytes.
    Module 790c2000: Size: 0x0(0)bytes.
    Module 02ea2380: Size: 0x0(0)bytes.
    Module 02ea2010: Size: 0x0(0)bytes.
    ……
    Module 1ed9705c: Size: 0x0(0)bytes.
    Module 1ed9a884: Size: 0x0(0)bytes.
    Module 1ed9e0ac: Size: 0x0(0)bytes.
    Module 1ee51944: Size: 0x0(0)bytes.
    Module 1ee5516c: Size: 0x0(0)bytes.
    Total size: 0x0(0)bytes
    --------------------------------------
    Module Lookup Table heaps:
    Module 50224000: Size: 0x0(0)bytes.
    Module 505c4000: Size: 0x0(0)bytes.
    Module 648ec000: Size: 0x0(0)bytes.
    Module 6638c000: Size: 0x0(0)bytes.
    Module 7a71e000: Size: 0x0(0)bytes.
    Module 502c2000: Size: 0x0(0)bytes.
    Module 790c2000: Size: 0x0(0)bytes.
    Module 02ea2380: Size: 0x0(0)bytes.
    Module 02ea2010: Size: 0x0(0)bytes.
    Module 69670000: Size: 0x0(0)bytes.
    ……
    Module 639ea000: Size: 0x0(0)bytes.
    Module 50d5a000: Size: 0x0(0)bytes.
    Module 653b4000: Size: 0x0(0)bytes.
    Module 02ea27cc: Size: 0x0(0)bytes.
    Module 1ed9705c: Size: 0x0(0)bytes.
    Module 1ed9a884: Size: 0x0(0)bytes.
    Module 1ed9e0ac: Size: 0x0(0)bytes.
    Module 1ee51944: Size: 0x0(0)bytes.
    Module 1ee5516c: Size: 0x0(0)bytes.
    Total size: 0x0(0)bytes
    --------------------------------------
    Total LoaderHeap size: 0xb08000(11567104)bytes

    =======================================

    上面只是!eeheap –loader输出的5%左右。从上面的输出来看,loader heap占用了11MB的内存。这个数字没问题,问题在于这个module list上面。这里成千上万的module,势必导致内存碎片。
    前面lmvm命令可以检查加载的module。但是lmvm命令工作方式是Win32层面的。如果DLL通过LoadLibrary起来的,这个命令能看到。但是CLR的动态DLL,除了使用LoadLibrary外,CLR还可以直接用MapViewOfFile的方法直接把DLL弄到内存中操作。这种情况lmvm就没把法了。所以需要用!eeheap –loader从CLR层面检查。
    除了!eeheap外,用!dumpdomain命令,也可以从CLR层面列举出所有的assembly,包括动态的和静态的。
    找到内存碎片的原因后,接下来就是分析这些碎片的来源了。既然这里是module,那随便挑一个,用!dumpmodule检查详细信息:
    0:000> !dumpmodule -mt 1ee5516c
    Name: cplxobsw, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
    Attributes: PEFile
    Assembly: 1e929530
    LoaderHeap: 00000000
    TypeDefToMethodTableMap: 1ee47f18
    TypeRefToMethodTableMap: 1ee47fe4
    MethodDefToDescMap: 1ee48058
    FieldDefToDescMap: 1ee484f4
    MemberRefToDescMap: 1ee486e8
    FileReferencesMap: 1ee488a4
    AssemblyReferencesMap: 1ee488a8
    MetaData start address: 1ee8be8c (49668 bytes)

    Types defined in this module

          MT    TypeDef Name
    ------------------------------------------------------------------------------
    1ee57e5c 0x02000002 Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap
    1ee587ac 0x02000003 Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderI_UAC_WSSoap
    1ee55844 0x02000004 Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializer1
    1ee56fac 0x02000005 Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer
    1ee5745c 0x02000006 Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer1
    1ee579d4 0x02000007 Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer2
    1ee575ec 0x02000008 Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer3
    1ee55e7c 0x02000009 Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer4
    1ee559cc 0x0200000a Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer5
    1ee55b5c 0x0200000b Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer6
    1ee57a9c 0x0200000c Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer7
    1ee55db4 0x0200000d Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer8
    1ee56714 0x0200000e Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer9
    1ee5777c 0x0200000f Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer10
    1ee57524 0x02000010 Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer11
    1ee56d54 0x02000011 Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer12
    1ee57844 0x02000012 Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer13
    1ee568a4 0x02000013 Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer14
    1ee576b4 0x02000014 Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer15
    1ee55a94 0x02000015 Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer16
    1ee55cec 0x02000016 Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer17
    1ee57204 0x02000017 Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer18
    1ee5619c 0x02000018 Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer19
    1ee5632c 0x02000019 Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer20
    1ee55f44 0x0200001a Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer21
    1ee572cc 0x0200001b Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer22
    1ee57c2c 0x0200001c Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer23
    1ee55c24 0x0200001d Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer24
    1ee56c8c 0x0200001e Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer25
    1ee567dc 0x0200001f Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer26
    1ee56e1c 0x02000020 Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer27
    1ee56584 0x02000021 Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer28
    1ee56a34 0x02000022 Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer29
    1ee5713c 0x02000023 Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer30
    1ee5600c 0x02000024 Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer31
    1ee57074 0x02000025 Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer32
    1ee560d4 0x02000026 Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer33
    1ee564bc 0x02000027 Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer34
    1ee5696c 0x02000028 Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer35
    1ee57394 0x02000029 Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer36
    1ee56ee4 0x0200002a Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer37
    1ee563f4 0x0200002b Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer38
    1ee56264 0x0200002c Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer39
    1ee56afc 0x0200002d Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer40
    1ee56bc4 0x0200002e Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer41
    1ee5790c 0x0200002f Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer42
    1ee5664c 0x02000030 Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer43
    1ee57b64 0x02000031 Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer44
    1ee55904 0x02000032 Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer45
    1ee5575c 0x02000033 Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializerContract

    Types referenced in this module

          MT    TypeRef Name
    ------------------------------------------------------------------------------
    63a191a4 0x01000001 System.Xml.Serialization.XmlSerializationWriter
    63a18ac0 0x01000002 System.Xml.Serialization.XmlSerializationReader
    63a19804 0x01000003 System.Xml.Serialization.XmlSerializer
    63a19798 0x01000004 System.Xml.Serialization.XmlSerializerImplementation
    1bb88e8c 0x01000005 t_UserInfo
    639f2988 0x01000006 System.Xml.XmlReader
    790fd8b4 0x01000007 System.Collections.Hashtable
    790ffe7c 0x01000008 System.Type
    790f9244 0x0100000e System.String
    790fdb60 0x0100000f System.Int32
    639f3758 0x01000010 System.Xml.XmlConvert
    790f8a7c 0x01000014 System.Object
    79103c00 0x01000019 System.Boolean
    639f59e0 0x0100001a System.Xml.XmlQualifiedName
    639fa358 0x0100001b System.Xml.XmlNameTable


    上面的输入就非常明显了。程序明显是在做XmlSerialization。接下来看看是在Serialize什么类型的object,有了这个信息后,去看源代码就更有方向了.随便找一个method table来看:


    0:000> !dumpmt -md 1ee57e5c
    EEClass: 1ee4b428
    Module: 1ee5516c
    Name: Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap
    mdToken: 02000002  (cplxobsw, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null)
    BaseSize: 0x44
    ComponentSize: 0x0
    Number of IFaces in IFaceMap: 0
    Slots in VTable: 53
    --------------------------------------
    MethodDesc Table
       Entry MethodDesc      JIT Name
    7934cdcc   79137ab8   PreJIT System.Object.ToString()
    7934bba0   79137ac0   PreJIT System.Object.Equals(System.Object)
    7934bb90   79137ad8   PreJIT System.Object.GetHashCode()
    793424c0   79137ae0   PreJIT System.Object.Finalize()
    1ee5802d   1ee57e38     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.InitCallbacks()
    1ee57f61   1ee57cc0     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write3_UserReg(System.Object[])
    1ee57f65   1ee57cc8     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write4_UserRegResponse(System.Object[])
    1ee57f69   1ee57cd0     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write5_UserRegSimple(System.Object[])
    1ee57f6d   1ee57cd8     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write6_UserRegSimpleResponse(System.Object[])
    1ee57f71   1ee57ce0     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write7_UserRegPhone(System.Object[])
    1ee57f75   1ee57ce8     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write8_UserRegPhoneResponse(System.Object[])
    1ee57f79   1ee57cf0     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write9_ModifyUserInfo(System.Object[])
    1ee57f7d   1ee57cf8     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write10_ModifyUserInfoResponse(System.Object[])
    1ee57f81   1ee57d00     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write11_UserLogin(System.Object[])
    1ee57f85   1ee57d08     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write12_UserLoginResponse(System.Object[])
    1ee57f89   1ee57d10     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write13_UserLogout(System.Object[])
    1ee57f8d   1ee57d18     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write14_UserLogoutResponse(System.Object[])
    1ee19d80   1ee57d20      JIT Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write15_GetUserInfo(System.Object[])
    1ee57f95   1ee57d28     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write16_GetUserInfoResponse(System.Object[])
    1ee57f99   1ee57d30     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write17_FindUser(System.Object[])
    1ee57f9d   1ee57d38     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write18_FindUserResponse(System.Object[])
    1ee57fa1   1ee57d40     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write19_FindUserEx(System.Object[])
    1ee57fa5   1ee57d48     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write20_FindUserExResponse(System.Object[])
    1ee57fa9   1ee57d50     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write21_ModifyPassword(System.Object[])
    1ee57fad   1ee57d58     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write22_ModifyPasswordResponse(System.Object[])
    1ee57fb1   1ee57d60     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write23_ResetPassword(System.Object[])
    1ee57fb5   1ee57d68     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write24_ResetPasswordResponse(System.Object[])
    1ee57fb9   1ee57d70     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write25_ModifyPasswordPhone(System.Object[])
    1ee57fbd   1ee57d78     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write26_ModifyPasswordPhoneResponse(System.Object[])
    1ee57fc1   1ee57d80     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write27_CheckUserToken(System.Object[])
    1ee57fc5   1ee57d88     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write28_CheckUserTokenResponse(System.Object[])
    1ee57fc9   1ee57d90     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write29_SetUserStatus(System.Object[])
    1ee57fcd   1ee57d98     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write30_SetUserStatusResponse(System.Object[])
    1ee57fd1   1ee57da0     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write31_ActivateUser(System.Object[])
    1ee57fd5   1ee57da8     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write32_ActivateUserResponse(System.Object[])
    1ee57fd9   1ee57db0     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write33_AppActivateUser(System.Object[])
    1ee57fdd   1ee57db8     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write34_AppActivateUserResponse(System.Object[])
    1ee57ff1   1ee57dc0     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write35_GetUserLoginHistory(System.Object[])
    1ee57ff5   1ee57dc8     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write36_GetUserLoginHistoryResponse(System.Object[])
    1ee57ff9   1ee57dd0     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write37_GetUnactiveUserNumber(System.Object[])
    1ee57ffd   1ee57dd8     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write38_GetUnactiveUserNumberResponse(System.Object[])
    1ee58001   1ee57de0     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write39_GetTtlUserNumber(System.Object[])
    1ee58005   1ee57de8     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write40_GetTtlUserNumberResponse(System.Object[])
    1ee58009   1ee57df0     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write41_GetActiveUserNumber(System.Object[])
    1ee5800d   1ee57df8     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write42_GetActiveUserNumberResponse(System.Object[])
    1ee58011   1ee57e00     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write43_DailyRegisterCount(System.Object[])
    1ee58015   1ee57e08     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write44_DailyRegisterCountResponse(System.Object[])
    1ee58019   1ee57e10     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write45_GetDailyReport(System.Object[])
    1ee5801d   1ee57e18     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write46_GetDailyReportResponse(System.Object[])
    1ee58021   1ee57e20     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write47_Test(System.Object[])
    1ee58025   1ee57e28     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write48_TestResponse(System.Object[])
    1ee19eb8   1ee57e30      JIT Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap.Write2_t_UserInfo(System.String, System.String, t_UserInfo, Boolean, Boolean)
    1ee58031   1ee57e40     NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterI_UAC_WSSoap..ctor()

    从上面的输出中,就能看到序列化类型的方法。有了这些方法,查找序列化的来源就容易多了。

    有了这些信息后,开发人员很容易地定位到问题跟WCF调用相关。实现WCF的时候选择了XML序列化方法。在下面这个blog的评论中,有人批评WCF XML序列化会导致这样的问题:
    http://blogs.msdn.com/tess/archive/2006/02/15/net-memory-leak-xmlserializing-your-way-to-a-memory-leak.aspx

    这个问题在这里已经非常明显了。当然dump中还有其它可以挖掘的地方。比如用!dumpheap –stat看看CLR object的数量。用!dumpheap –mt寻找一些序列化object的地址,然后用!gcroot看看序列化object的引用关系。或者用!finalizequeue看看是否堆积了大量的object等待Dispose。由于篇幅的关系,这些细枝末节就不列举了。

    总的说来,!eeheap –gc隔离问题到loader heap和dynamic module, !dumpmodule –mt找到引发序列化的类型,!dumpmt –md找出类型的详细信息。三个命令就可以隔离出问题。
    该问题最后通过WCF object pool的方法缓存WCF client proxy,解决问题。

  • 相关阅读:
    Mysql常用sql语句(18)- union 全连接
    Mysql常用sql语句(17)- left / right join 外连接
    Mysql常用sql语句(16)- inner join 内连接
    Mysql常用sql语句(15)- cross join 交叉连接
    Mysql常用sql语句(14)- 多表查询
    PAT甲级专题|链表
    编程范式|程序世界里的编程范式,探索语言本质
    PAT甲级专题|树的遍历
    Java学习路线|转至CodeSheep
    SQL必知必会|SQL基础篇
  • 原文地址:https://www.cnblogs.com/lixiong/p/938430.html
Copyright © 2020-2023  润新知