- 爱易网页
 
                        - 
                            ASP.NET教程
 
                        - [经验分享]压力测试中因为Session而导致的OutOfMemoryException内存溢出有关问题及解决 
 
                         
                    
                    
                    日期:2014-05-17  浏览次数:20631 次 
                    
                        
                         [经验分享]压力测试中因为Session而导致的OutOfMemoryException内存溢出问题及解决
这几天开发了一个Web站点,主要用于给其它站点做接口数据返回,在提交压力测试时,经常内存增长到1G后,溢出了,因为程序本身确实会加载不少缓存数据,而服务器本身是Windows2003 32位的操作系统,最大只支持2g内存,通过参考页面:http://support.microsoft.com/?kbID=810371,在boot.ini里增加启动参数:/3gb /Userva=3030  
从而让程序可以使用到3G内存,然后继续提交压力测试
结果测试时,内存依旧持续增长,增长到2G后,又内存溢出了,至此,怀疑程序有内存泄露
找了一个win7版本的任务管理器,拷贝到服务器上,在内存达到2G时,创建了一个w3wp进程的dump(下面的创建转储文件)
抓下来dump文件后,在本地用Windbg加载sos.dll进行分析,通过!dumpheap -stat命令,发现占用内存最大的3个对象是:
6611b1b0  5027584    241324032 System.Web.SessionState.InProcSessionState
66149064  5027602    361987344 System.Web.Caching.CacheEntry
79330b24  5575562    378271928 System.String
各占用了241M、361M、378M,因为事先知道String占用这么大是正常的,所以要去分析另外2个对象,在Windbg里通过:  !dumpheap -type System.Web.Caching.CacheEntry  命令,查看所有具体的CacheEntry地址等信息,这个会很多,数据一出来,马上按Ctrl+Break,数据大致如下
  0:000> !dumpheap -type System.Web.Caching.CacheEntry
------------------------------
Heap 0
  Address       MT     Size
106837a8 044b3ac4       72      
107b0de0 044b3ac4       72      
107b1e74 044b3ac4       72      
107bdc14 044b3ac4       72      
107bdef8 044b3ac4       72      
107c1290 044b3ac4       72      
107c1370 044b3ac4       72      
107c142c 044b3ac4       72      
107c20f8 044b3ac4       72      
先找第一个地址分析:
0:000> !do 106837a8
Name: System.Web.Caching.CacheEntry
MethodTable: 044b3ac4
EEClass: 044aac24
Size: 72(0x48) bytes
  (C:\WINDOWS\assembly\GAC_32\System.Web\2.0.0.0__b03f5f7f11d50a3a\System.Web.dll)
Fields:
       MT    Field   Offset                 Type VT     Attr    Value Name
02469134  400140c        4        System.String  0 instance 10683740 _key
030fb350  400140d        c          System.Byte  1 instance       16 _bits
03154d18  400140e        8         System.Int32  1 instance -1350406618 _hashCode
02466d54  4001415       10        System.Object  0 instance 10683794 _value
0321ab48  4001416       1c      System.DateTime  1 instance 106837c4 _utcCreated
0321ab48  4001417       24      System.DateTime  1 instance 106837cc _utcExpires
0321dda4  4001418       2c      System.TimeSpan  1 instance 106837d4 _slidingExpiration
030fb350  4001419        d          System.Byte  1 instance 4294967295 _expiresBucket
044b3964  400141a       34 ...g.ExpiresEntryRef  1 instance 106837dc _expiresEntryRef
030fb350  400141b        e          System.Byte  1 instance        2 _usageBucket
044b3a6c  400141c       38 ...ing.UsageEntryRef  1 instance 106837e0 _usageEntryRef
0321ab48  400141d       3c      System.DateTime  1 instance 106837e4 _utcLastUpdate
044b32f0  400141e       14 ...g.CacheDependency  0 instance 00000000 _dependency
02466d54  400141f       18        System.Object  0 instance 00000000 _onRemovedTargets
0321ab48  4001412      1e4      System.DateTime  1   shared   static NoAbsoluteExpiration
     >> Domain:Value  000dd050:NotInit  0012ad78:1616ba94 <<
0321dda4  4001413      1e8      System.TimeSpan  1   shared   static NoSlidingExpiration
     >> Domain:Value  000dd050:NotInit  0012ad78:1616baa4 <<
0321dda4  4001414      1ec      System.TimeSpan  1   shared   static OneYear
     >> Domain:Value  000dd050:NotInit  0012ad78:1616bab4 <<
然后再看_key的值
0:000> !do 10683740  
Name: System.String
MethodTable: 02469134
EEClass: 02a42780
Size: 82(0x52) bytes
  (C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)
String: f2029612887/recommendservice.svc
再看_value的值
0:000> !do 10683794  
Name: System.Web.Configuration.MapPathCacheInfo
MethodTable: 047026d0
EEClass: 04776bb8
Size: 20(0x14) bytes