一、问题背景
最近在对客户采集服务优化的时候,无意间点开客户服务器上另外一个我们的小的采集服务,发现一堆错误日志,一直在报“OutOf memory”错误,查看服务占用内存1.7G,基本上在崩溃的边缘了(Win32程序),于是就安排下面的人先用WinDBG分析一下内存问题,因为WinDBG也是去年刚开始用,对简单的内存过高、CPU过高能简单分析一下,也是想通过这个机会锻炼一下下面的人员。按正常来说这个小采集服务下面挂的设备并不多,内存不应该占用这么大,我们的Socket服务端接受到Socket客户端连接请求后会将连接以对象形式保存,收到的数据会先放到队列中,由另外一个线程进行保存,第一感觉是处理不过来,导致内存堆积。
二、初步结论
第二天下面人员给我汇报的通过!dumpheap -stat查看的结果是队列中倒是不大,但是有一部分Free状态的占了1.2G左右
734342a8 4763 57156 System.Int32 7347eb24 4936 59232 System.Threading.Overlapped 6f31bca4 1051 71468 System.Data.DataRow 03bc8e94 1051 75672 SunElecFlowService.MemLib.MemMeterObject 7295c3a4 4771 76336 System.Net.CallbackClosure 72976b2c 4854 77664 System.Net.IPEndPoint 72977e50 4769 95380 System.Net.SafeNativeOverlapped 72977fcc 4772 95440 System.Net.SafeCloseSocket+InnerSafeCloseSocket 73432788 1386 114036 System.Object[] 7295b5c0 4769 114456 System.Net.Sockets.OverlappedCache 729780c4 4774 114576 System.Net.SafeCloseSocket 7347c3d8 4858 136008 System.UInt16[] 008ba934 231 142356 Sun.LogLib.LogInfo[] 7295af40 4771 152672 System.Net.Sockets.Socket+CacheSet 7347e278 4788 153216 System.AsyncCallback 7293910c 4857 194280 System.Net.IPAddress 73439814 12 196752 System.DateTime[] 048e7234 4770 228960 Sun.SocketHelper.Session 7343e634 4964 317696 System.Threading.OverlappedData 03bc8b44 1051 353136 SunElecFlowService.Model.Meters 73434ec0 549 355968 System.Collections.Hashtable+bucket[] 73436bf0 9314 409816 System.Threading.ExecutionContext 73432d74 411 426836 System.String[] 72976ad0 4774 439208 System.Net.Sockets.Socket 7295b7ac 4533 453300 System.Net.Sockets.OverlappedAsyncResult 008b9418 20005 640160 Sun.LogLib.LogInfo 734395fc 20 655600 System.Decimal[] 7343426c 590 809640 System.Int32[] 6f30b160 7408 1037120 System.Data.SqlClient._SqlMetaData 734324e4 90972 15123324 System.String 73435c40 11568 314405813 System.Byte[] 00a2e3a8 6998 1443884320 Free
上面只列出了一部分,可以看到Free确实占到了1.2G左右,这就比较奇怪了,按正常来说这部分应该可以继续使用的,为何会溢出,又翻看了一下代码,初步发现了一些问题:1、接收Socket连接时,缓冲区的大小初始定的是64K 2、未处理无效的连接对象。
三、最终结论
于是网上根据 Free dumpheap查询相关关键词,找到了一篇博文记一次 .NET 某电商定向爬虫 内存碎片化分析,博主的关于WinDBG的文章之前看过,也关注过公众号,通过查看,确实与我们的现象比较类似,按博主推断,是由于一些对象未及时释放,导致同一个GC段中的对象未释放,分析如下:
!dumpheap 5d830000 5e82e73c Address MT Size 5d831000 00a2e3a8 6986 Free 5d832b4c 73435c40 65548 5d842b58 00a2e3a8 11854 Free 5d8459a8 73435c40 65548 5d8559b4 73435c40 65548 5d8659c0 008b9418 32 5d8659e0 00a2e3a8 7582 Free 5d867780 73435c40 65548 5d87778c 00a2e3a8 46054 Free 5d882b74 73435c40 65548 5d892b80 73435c40 65548 5d8a2b8c 00a2e3a8 65546 Free 5d8b2b98 73435c40 65548 5d8c2ba4 00a2e3a8 90350 Free 5d8d8c94 73435c40 65548 5d8e8ca0 00a2e3a8 10 Free 5d8e8cac 73435c40 65548 5d8f8cb8 73435c40 65548 5d908cc4 734324e4 18 5d908cd8 00a2e3a8 234 Free 5d908dc4 73435c40 65548 5d918dd0 734324e4 2050 5d9195d4 00a2e3a8 9298 Free 5d91ba28 73435c40 65548 5d92ba34 00a2e3a8 10 Free 5d92ba40 73435c40 65548 5d93ba4c 00a2e3a8 238 Free 5d93bb3c 73435c40 65548 5d94bb48 73435c40 65548 5d95bb54 734324e4 2050 5d95c358 00a2e3a8 6390 Free 5d95dc50 73435c40 65548 5d96dc5c 73435c40 65548 5d97dc68 00a2e3a8 38930 Free 5d98747c 73435c40 65548 5d997488 734324e4 96 5d9974e8 00a2e3a8 65450 Free 5d9a7494 73435c40 65548 5d9b74a0 73435c40 65548 5d9c74ac 00a2e3a8 21094 Free 5d9cc714 73435c40 65548 5d9dc720 00a2e3a8 65546 Free 5d9ec72c 73435c40 65548 5d9fc738 00a2e3a8 138 Free 5d9fc7c4 73435c40 65548 5da0c7d0 008b9418 32 5da0c7f0 00a2e3a8 22854 Free 5da12138 73435c40 65548 5da22144 73435c40 65548 5da32150 00a2e3a8 24826 Free 5da3824c 73435c40 65548 5da48258 73435c40 65548 5da58264 00a2e3a8 33170 Free 5da603f8 73435c40 65548 5da70404 734324e4 1538 5da70a08 00a2e3a8 51034 Free 5da7d164 73435c40 65548 5da8d170 734324e4 2050 5da8d974 00a2e3a8 10430 Free 5da90234 73435c40 65548 5daa0240 00a2e3a8 8238 Free 5daa2270 73435c40 65548 5dab227c 73435c40 65548 5dac2288 734324e4 1794 5dac298c 00a2e3a8 11026 Free 5dac54a0 73435c40 65548 5dad54ac 734324e4 2050 5dad5cb0 00a2e3a8 36502 Free 5dadeb48 73435c40 65548 5daeeb54 734324e4 2050 5daef358 00a2e3a8 10886 Free 5daf1de0 73435c40 65548 5db01dec 73435c40 65548 5db11df8 73435c40 65548 5db21e04 734324e4 2042 5db22600 00a2e3a8 6450 Free 5db23f34 73435c40 65548 5db33f40 00a2e3a8 8162 Free 5db35f24 73435c40 65548 5db45f30 73435c40 65548 5db55f3c 00a2e3a8 530 Free 5db56150 73435c40 65548 5db6615c 73435c40 65548 5db76168 00a2e3a8 494 Free 5db76358 73435c40 65548 5db86364 00a2e3a8 10 Free 5db86370 73435c40 65548 5db9637c 734324e4 296 5db964a4 00a2e3a8 11114 Free 5db99010 73435c40 65548 5dba901c 734324e4 2042 5dba9818 00a2e3a8 6410 Free 5dbab124 73435c40 65548 5dbbb130 734324e4 1538 5dbbb734 00a2e3a8 14590 Free 5dbbf034 73435c40 65548 5dbcf040 734324e4 2050 5dbcf844 00a2e3a8 60162 Free 5dbde348 73435c40 65548 5dbee354 00a2e3a8 65546 Free 5dbfe360 73435c40 65548 5dc0e36c 73435c40 65548 5dc1e378 00a2e3a8 238 Free 5dc1e468 73435c40 65548 5dc2e474 00a2e3a8 10 Free 5dc2e480 73435c40 65548 5dc3e48c 00a2e3a8 32754 Free 5dc46480 73435c40 65548 5dc5648c 73435c40 65548 5dc66498 73435c40 65548 5dc764a4 00a2e3a8 11390 Free 5dc79124 73435c40 65548 5dc89130 734324e4 1538 5dc89734 00a2e3a8 14842 Free 5dc8d130 73435c40 65548 5dc9d13c 73435c40 65548 5dcad148 734324e4 2050 5dcad94c 00a2e3a8 38894 Free 5dcb713c 73435c40 65548 5dcc7148 734324e4 2042 5dcc7944 00a2e3a8 60354 Free 5dcd6508 73435c40 65548 5dce6514 73435c40 65548 5dcf6520 73435c40 65548 5dd0652c 00a2e3a8 16622 Free 5dd0a61c 73435c40 65548 5dd1a628 00a2e3a8 10 Free 5dd1a634 73435c40 65548 5dd2a640 734324e4 2042 5dd2ae3c 00a2e3a8 45842 Free 5dd36150 73435c40 65548 5dd4615c 734324e4 96 5dd461bc 00a2e3a8 41126 Free 5dd50264 73435c40 65548 5dd60270 00a2e3a8 10 Free 5dd6027c 73435c40 65548 5dd70288 734324e4 2042 5dd70a84 00a2e3a8 5846 Free 5dd7215c 73435c40 65548 5dd82168 734324e4 1538 5dd8276c 73435c40 65548 5dd92778 734324e4 2050 5dd92f7c 00a2e3a8 37354 Free 5dd9c168 73435c40 65548 5ddac174 73435c40 65548 5ddbc180 00a2e3a8 8866 Free 5ddbe424 73435c40 65548 5ddce430 73435c40 65548 5ddde43c 734324e4 1538 5dddea40 00a2e3a8 6594 Free 5dde0404 73435c40 65548 5ddf0410 734324e4 104 5ddf0478 00a2e3a8 65198 Free 5de00328 73435c40 65548 5de10334 73435c40 65548 5de20340 00a2e3a8 1026 Free 5de20744 73435c40 65548 5de30750 73435c40 65548 5de4075c 734324e4 2050 5de40f60 00a2e3a8 10782 Free 5de43980 73435c40 65548 5de5398c 734324e4 2050 5de54190 00a2e3a8 9950 Free 5de56870 73435c40 65548 5de6687c 734324e4 2050 5de67080 00a2e3a8 10478 Free 5de69970 73435c40 65548 5de7997c 73435c40 65548 5de89988 008b9418 32 5de899a8 00a2e3a8 12438 Free 5de8ca40 73435c40 65548 5de9ca4c 73435c40 65548 5deaca58 73435c40 65548 5debca64 73435c40 65548 5decca70 734324e4 1538 5decd074 00a2e3a8 18718 Free 5ded1994 73435c40 65548 5dee19a0 73435c40 65548 5def19ac 73435c40 65548 5df019b8 00a2e3a8 47694 Free 5df0d408 73435c40 65548 5df1d414 00a2e3a8 29098 Free 5df245c0 73435c40 65548 5df345cc 73435c40 65548 5df445d8 73435c40 65548 5df545e4 00a2e3a8 65534 Free 5df645e4 73435c40 65548 5df745f0 73435c40 65548 5df845fc 00a2e3a8 122274 Free 5dfa23a0 73435c40 65548 5dfb23ac 00a2e3a8 46 Free 5dfb23dc 73435c40 65548 5dfc23e8 73435c40 65548 5dfd23f4 734324e4 2042 5dfd2bf0 00a2e3a8 10778 Free 5dfd560c 73435c40 65548 5dfe5618 734324e4 2050 5dfe5e1c 00a2e3a8 26058 Free 5dfec3e8 73435c40 65548 5dffc3f4 73435c40 65548 5e00c400 00a2e3a8 16646 Free 5e010508 73435c40 65548 5e020514 00a2e3a8 188066 Free 5e04e3b8 73435c40 65548 5e05e3c4 73435c40 65548 5e06e3d0 734324e4 1538 5e06e9d4 00a2e3a8 64006 Free 5e07e3dc 73435c40 65548 5e08e3e8 7293910c 40 5e08e410 00a2e3a8 65506 Free 5e09e3f4 73435c40 65548 5e0ae400 73435c40 65548 5e0be40c 00a2e3a8 13018 Free 5e0c16e8 73435c40 65548 5e0d16f4 734324e4 2050 5e0d1ef8 00a2e3a8 10782 Free 5e0d4918 73435c40 65548 5e0e4924 73435c40 65548 5e0f4930 00a2e3a8 12482 Free 5e0f79f4 73435c40 65548 5e107a00 73435c40 65548 5e117a0c 73435c40 65548 5e127a18 734324e4 1538 5e12801c 00a2e3a8 6902 Free 5e129b14 73435c40 65548 5e139b20 73435c40 65548 5e149b2c 734324e4 80 5e149b7c 00a2e3a8 4454 Free 5e14ace4 73435c40 65548 5e15acf0 73435c40 65548 5e16acfc 734324e4 150 5e16ad94 00a2e3a8 946 Free 5e16b148 73435c40 65548 5e17b154 73435c40 65548 5e18b160 00a2e3a8 65546 Free 5e19b16c 73435c40 65548 5e1ab178 73435c40 65548 5e1bb184 73435c40 65548 5e1cb190 73435c40 65548 5e1db19c 734324e4 2050 5e1db9a0 00a2e3a8 22510 Free 5e1e1190 73435c40 65548 5e1f119c 734324e4 18 5e1f11b0 00a2e3a8 8134 Free 5e1f3178 73435c40 65548 5e203184 734324e4 1322 5e2036b0 00a2e3a8 15058 Free 5e207184 73435c40 65548 5e217190 734324e4 18 5e2171a4 00a2e3a8 8158 Free 5e219184 73435c40 65548 5e229190 734324e4 2042 5e22998c 00a2e3a8 14326 Free 5e22d184 73435c40 65548 5e23d190 73435c40 65548 5e24d19c 00a2e3a8 131094 Free 5e26d1b4 73435c40 65548 5e27d1c0 734324e4 2050 5e27d9c4 00a2e3a8 10794 Free 5e2803f0 73435c40 65548 5e2903fc 00a2e3a8 65546 Free 5e2a0408 73435c40 65548 5e2b0414 00a2e3a8 65546 Free 5e2c0420 73435c40 65548 5e2d042c 00a2e3a8 12666 Free 5e2d35a8 73435c40 65548 5e2e35b4 73435c40 65548 5e2f35c0 73435c40 65548 5e3035cc 00a2e3a8 23162 Free 5e309048 73435c40 65548 5e319054 00a2e3a8 65546 Free 5e329060 73435c40 65548 5e33906c 73435c40 65548 5e349078 00a2e3a8 13166 Free 5e34c3e8 73435c40 65548 5e35c3f4 00a2e3a8 12474 Free 5e35f4b0 73435c40 65548 5e36f4bc 73435c40 65548 5e37f4c8 73435c40 65548 5e38f4d4 00a2e3a8 57318 Free 5e39d4bc 73435c40 65548 5e3ad4c8 00a2e3a8 32766 Free 5e3b54c8 73435c40 65548 5e3c54d4 00a2e3a8 65546 Free 5e3d54e0 73435c40 65548 5e3e54ec 00a2e3a8 64382 Free 5e3f506c 73435c40 65548 5e405078 00a2e3a8 27694 Free 5e40bca8 73435c40 65548 5e41bcb4 73435c40 65548 5e42bcc0 00a2e3a8 21418 Free 5e43106c 73435c40 65548 5e441078 73435c40 65548 5e451084 00a2e3a8 12658 Free 5e4541f8 73435c40 65548 5e464204 00a2e3a8 12666 Free 5e467380 73435c40 65548 5e47738c 73435c40 65548 5e487398 00a2e3a8 15750 Free 5e48b120 73435c40 65548 5e49b12c 73435c40 65548 5e4ab138 00a2e3a8 49162 Free 5e4b7144 73435c40 65548 5e4c7150 73435c40 65548 5e4d715c 008b9418 32 5e4d717c 73435c40 65548 5e4e7188 73435c40 65548 5e4f7194 00a2e3a8 33118 Free 5e4ff2f4 73435c40 65548 5e50f300 73435c40 65548 5e51f30c 00a2e3a8 12482 Free 5e5223d0 73435c40 65548 5e5323dc 73435c40 65548 5e5423e8 00a2e3a8 60786 Free 5e55115c 73435c40 65548 5e561168 00a2e3a8 45518 Free 5e56c338 73435c40 65548 5e57c344 73435c40 65548 5e58c350 73435c40 65548 5e59c35c 73435c40 65548 5e5ac368 00a2e3a8 12834 Free 5e5af58c 73435c40 65548 5e5bf598 734324e4 2050 5e5bfd9c 73435c40 65548 5e5cfda8 73435c40 65548 5e5dfdb4 73435c40 12 5e5dfdc0 00a2e3a8 3678 Free 5e5e0c20 73435c40 65548 5e5f0c2c 73435c40 65548 5e600c38 00a2e3a8 90882 Free 5e616f3c 73435c40 65548 5e626f48 00a2e3a8 12666 Free 5e62a0c4 73435c40 65548 5e63a0d0 73435c40 65548 5e64a0dc 00a2e3a8 22 Free 5e64a0f4 73435c40 65548 5e65a100 734324e4 40 5e65a128 00a2e3a8 4866 Free 5e65b42c 73435c40 65548 5e66b438 73435c40 65548 5e67b444 00a2e3a8 53442 Free 5e688508 73435c40 65548 5e698514 73435c40 65548 5e6a8520 00a2e3a8 45514 Free 5e6b36ec 73435c40 65548 5e6c36f8 73435c40 65548 5e6d3704 00a2e3a8 138 Free 5e6d3790 73435c40 65548 5e6e379c 73435c40 65548 5e6f37a8 73435c40 65548 5e7037b4 00a2e3a8 10302 Free 5e705ff4 73435c40 65548 5e716000 734324e4 1794 5e716704 00a2e3a8 262 Free 5e71680c 73435c40 65548 5e726818 734324e4 2050 5e72701c 00a2e3a8 6126 Free 5e72880c 73435c40 65548 5e738818 00a2e3a8 20918 Free 5e73d9d0 73435c40 65548 5e74d9dc 00a2e3a8 12482 Free 5e750aa0 73435c40 65548 5e760aac 00a2e3a8 12474 Free 5e763b68 73435c40 65548 5e773b74 00a2e3a8 12666 Free 5e776cf0 73435c40 65548 5e786cfc 00a2e3a8 12658 Free 5e789e70 73435c40 65548 5e799e7c 00a2e3a8 12654 Free 5e79cfec 73435c40 65548 5e7acff8 00a2e3a8 12666 Free 5e7b0174 73435c40 65548 5e7c0180 73435c40 65548 5e7d018c 00a2e3a8 12666 Free 5e7d3308 73435c40 65548 5e7e3314 73435c40 65548 5e7f3320 73435c40 65548 5e80332c 00a2e3a8 46070 Free 5e80e724 73435c40 65548 5e81e730 73435c40 65548
可以看到,同一个GC段中的对象部分被标记为Free,而且是间隔出现。
继续查看两个非Free状态属于哪个类
!gcroot 5e7c0180 HandleTable: 008913e8 (pinned handle) -> 020c5568 System.Object[] -> 0114e8bc System.Collections.Hashtable -> 0147ead8 System.Collections.Hashtable+bucket[] -> 01477c04 SunElecFlowService.MemLib.MemMeterObject -> 0e6dfe58 Sun.SocketHelper.Session -> 5e7c0180 System.Byte[] 008932ec (async pinned handle) -> 05212298 System.Threading.OverlappedData -> 5e7c0180 System.Byte[] !gcroot 5e80e724 HandleTable: 008913e8 (pinned handle) -> 020c5568 System.Object[] -> 0114e8bc System.Collections.Hashtable -> 0147ead8 System.Collections.Hashtable+bucket[] -> 0146e578 SunElecFlowService.MemLib.MemMeterObject -> 01844fb8 Sun.SocketHelper.Session -> 01844edc System.Net.Sockets.Socket -> 01845070 System.Net.Sockets.Socket+CacheSet -> 018450f4 System.Net.CallbackClosure -> 01845050 System.AsyncCallback -> 01493ea8 Sun.SocketHelper.Server -> 01493f74 System.Collections.Hashtable -> 0210ac08 System.Collections.Hashtable+bucket[] -> 0e6e6400 Sun.SocketHelper.Session -> 5e80e724 System.Byte[] 008935b0 (async pinned handle) -> 018bfb48 System.Threading.OverlappedData -> 5e80e724 System.Byte[]
通过查看两个对象,圴为Session对象下面的缓冲区
至此,问题大致清晰了:Session对象未及时清理导致的内存溢出。
参考: https://www.cnblogs.com/huangxincheng/p/15391950.html