当前位置:首页 > Windbg 命令基础、符合与源码
MethodTable: 000007fef0667d90 EEClass: 000007fef026e560 Size: 411932(0x6491c) bytes
(C:\\Windows\\assembly\\GAC_64\\mscorlib\\2.0.0.0__b77a5c561934e089\\mscorlib.dll)
String: 粤A87xxx,粤ACxxx挂...... Fields:
MT Field Offset Type VT Attr Value Name
000007fef066f000 40000968 System.Int32 1 instance 205954 m_arrayLength
000007fef066f000 4000097 c System.Int32 1 instance 205953 m_stringLength
000007fef06697d8 400009810 System.Char 1 instance 7ca4 m_firstChar
000007fef0667d90 400009920 System.String 0 shared static Empty
>> Domain:Value 000000000112bef0:00000001ff350370 000000000372e6e0:00000001ff350370 <<
000007fef0669688 400009a 28 System.Char[] 0 shared static WhitespaceChars
>> Domain:Value 000000000112bef0:00000001ff350b60 000000000372e6e0:00000001ff3588e8 <<
做到这里,本次系统变卡的原因貌似已经有一个说法已经说得过去了,就是Asp.net尝试分配一个大对象,.Net中超过85Kb就叫大对象。但是内存不足,于是触发GC回收,回收不到一个400Kb长的内存块,于是报了一个内存溢出异常。
这个道理乍一看,似乎说得通,但是实际上很诡异,.Net上只是使用了2G左右的内存,一共24G内存的服务器为什么只是用了2G内存,GC拼命回收垃圾呢?为什么只是用了2G内存就分配不出400KB的内存了呢?
在这个地方,卡住了,中途以为是内存频繁分配造成大量碎片,往内存碎片方向跟过,最后确定与内存碎片无关。原因是不相信这个东西。因为服务器是24核CPU,24G内存。24G内存使用了2G内存就出现这个问题。
这个问题想了两天,百思不得其解。后来,又无意中发现了一个小苗头。 !dumpheap -stat
0:000> !dumpheap -stat
------------------------------ ?
000007fef0668168 1 136 System.OutOfMemoryException
?
000007fef066f8b0 67392
46915920System.Collections.Hashtable+bucket[]
000007fef0667d90 291003 96055608 System.String Total 2737406 objects
Fragmented blocks larger than 0.5 MB: Addr Size Followed by
000000014f92ff10 4.2MB 000000014fd5c698 System.String 000000019fb89940 6.3MB 00000001a01d57b8 System.Threading.OverlappedData 000000020fb18698 5.7MB 00000002100ccc70 System.Threading.Overlapped 在上千行的返回结果中,居然无意中瞟到一个
System.OutOfMemoryException。熟悉C#的应该都知道,这个是内存溢出异常,当内存不足时才会发生。
本来说分配不出400KB内存我还很怀疑,现在又无意中从上千行的返回结果中瞟到这一行代码。确定是内存问题,于是怀疑是Asp.net配置文件不正确,导致系统最多只能够用到2G内存呢?因为Asp.net Web.Config里面的
processModel节点有个memoryLimit参数,可以设置Asp.net能够使用的最大内存。但是从网站一直跟到服务器的配置文件,都没有发现有设置该参数,也就是说,Asp.net使用默认设置是60%。24G*60%最大是能够使用14G左右的内存。 太诡异了,实在想不通。最后,只有碰碰运气了,随便输入些变量看看值有没有什么问题。(实际上本处也有章法可依,如果此时找到不问题,最应该就是找到这次请求的参数,重现与当时客户一样的操作),当随手在输入如下命令之后,突然眼前一亮。
依次执行如下3个指令:
0:083> !do 000000015f416b08 //换了个DUMP,本来这个地址是出现在 !dso命令里的
Name: System.Web.HttpContext MethodTable: 000007feecc075c8 EEClass: 000007feec862438 Size: 336(0x150) bytes
(C:\\Windows\\assembly\\GAC_64\\System.Web\\2.0.0.0__b03f5f7f11d50a3a\\System.Web.dll) Fields:
MT Field Offset Type VT Attr Value Name
000007feecc0a0f0 4000fe6 8 ...IHttpAsyncHandler 0 instance0000000000000000 _asyncAppHandler
000007feecc09c20 4000fe7 10...b.HttpApplication 0 instance 000000022f3cc5d0 _appInstance
共分享92篇相关文档