SignalR(=< v0.5.1)存在一个问题,其中请求闲置并吸收内存。这似乎已经用v0.5.2纠正了。但是,可能还有其他问题。
使用WINDBG,我创建了我的新闻源进程的内存转储。
首先,这里是SignalR.InMemoryMessage的计数和内存消耗:
133099 6388752 System.Collections.Concurrent.ConcurrentDictionary`2+Node[[System.String, mscorlib],[SignalR.Infrastructure.LockedList`1[[System.Action`1[[System.Collections.Generic.IList`1[[SignalR.InMemoryMessage...
最后,以下是前3个内存消耗对象的值:
000007fef9960bb0 79307 140001536 System.Byte[]
000007fef9956960 1704571 175128912 System.String
000007fef995ae68 1901299 549202440 System.Object[]
执行!dumpheap -mt 000007fef995ae68
,我得到了方法表的相当长的概述。大多数物体的尺寸相对较小,这是预期的。但是,在转储结束时,我看到以下内容:
00000001eb0f3220 000007fef995ae68 160
00000001eb0f3580 000007fef995ae68 40
00000001eb0f35f0 000007fef995ae68 40
00000001eb0f3758 000007fef995ae68 56
00000001eb0f37c8 000007fef995ae68 88
00000001eb0f3820 000007fef995ae68 48
00000001eb0f3cc8 000007fef995ae68 40
00000001eb0f4570 000007fef995ae68 40
00000001eb0f45e0 000007fef995ae68 40
00000001eb0f4650 000007fef995ae68 40
00000001eb0f4de8 000007fef995ae68 176
00000001eb0f4ed0 000007fef995ae68 40
00000001eb9b3380 000007fef995ae68 40
00000001eb9b33c0 000007fef995ae68 40
0000000237580080 000007fef995ae68 1146888
所以我继续做!gcroot 0000000237580080
。一些初始转储如下:
0000000237580080 000007fef995ae68 1146888
total 0 objects
------------------------------
total 0 objects
Statistics:
MT Count TotalSize Class Name
000007fef995ae68 1901299 549202440 System.Object[]
Total 1901299 objects
0:045> !gcroot 0000000237580080
Note: Roots found on stacks may be false positives. Run "!help gcroot" for
more info.
Scan Thread 11 OSTHread 1040
Scan Thread 24 OSTHread c18
Scan Thread 26 OSTHread 488
Scan Thread 27 OSTHread 1144
Scan Thread 28 OSTHread 14b0
RSP:57ae0f0:Root: 000000012acea438(MyApp.Newsfeed.Hubs.NewsfeedHub)->
000000012acea5f8(SignalR.GroupManager)->
0000000185a17328(SignalR.Connection)->
000000011f655ed0(SignalR.InProcessMessageBus)->
000000011f656680(System.Collections.Concurrent.ConcurrentDictionary`2[[System.String, mscorlib],[SignalR.Infrastructure.LockedList`1[[System.Action`1[[System.Collections.Generic.IList`1[[SignalR.InMemoryMessage`1[[System.UInt64, mscorlib]], SignalR]], mscorlib]], mscorlib]], SignalR]])->
0000000237580080(System.Object[])
RSP:57ae100:Root: 000000012acea098(System.Linq.Enumerable+WhereSelectEnumerableIterator`2[[SignalR.Hubs.IDisconnect, SignalR],[System.Threading.Tasks.Task, mscorlib]])->
000000012acea058(System.Func`2[[SignalR.Hubs.IDisconnect, SignalR],[System.Threading.Tasks.Task, mscorlib]])->
000000012ace9ea8(SignalR.Hubs.HubDispatcher+<>c__DisplayClass1a`1[[SignalR.Hubs.IDisconnect, SignalR]])->
0000000185a13640(SignalR.Hubs.HubDispatcher)->
000000011f655ed0(SignalR.InProcessMessageBus)->
000000011f656680(System.Collections.Concurrent.ConcurrentDictionary`2[[System.String, mscorlib],[SignalR.Infrastructure.LockedList`1[[System.Action`1[[System.Collections.Generic.IList`1[[SignalR.InMemoryMessage`1[[System.UInt64, mscorlib]], SignalR]], mscorlib]], mscorlib]], SignalR]])->
0000000237580080(System.Object[])
RSP:57ae130:Root: 000000012acea438(MyApp.Newsfeed.Hubs.NewsfeedHub)->
000000012acea5f8(SignalR.GroupManager)->
0000000185a17328(SignalR.Connection)->
000000011f655ed0(SignalR.InProcessMessageBus)->
000000011f656680(System.Collections.Concurrent.ConcurrentDictionary`2[[System.String, mscorlib],[SignalR.Infrastructure.LockedList`1[[System.Action`1[[System.Collections.Generic.IList`1[[SignalR.InMemoryMessage`1[[System.UInt64, mscorlib]], SignalR]], mscorlib]], mscorlib]], SignalR]])->
0000000237580080(System.Object[])
RSP:57ae140:Root: 000000012acea438(MyApp.Newsfeed.Hubs.NewsfeedHub)->
000000012acea5f8(SignalR.GroupManager)->
0000000185a17328(SignalR.Connection)->
000000011f655ed0(SignalR.InProcessMessageBus)->
000000011f656680(System.Collections.Concurrent.ConcurrentDictionary`2[[System.String, mscorlib],[SignalR.Infrastructure.LockedList`1[[System.Action`1[[System.Collections.Generic.IList`1[[SignalR.InMemoryMessage`1[[System.UInt64, mscorlib]], SignalR]], mscorlib]], mscorlib]], SignalR]])->
0000000237580080(System.Object[])
RSP:57ae188:Root: 000000012ace9ea8(SignalR.Hubs.HubDispatcher+<>c__DisplayClass1a`1[[SignalR.Hubs.IDisconnect, SignalR]])->
0000000185a13640(SignalR.Hubs.HubDispatcher)->
000000011f655ed0(SignalR.InProcessMessageBus)->
000000011f656680(System.Collections.Concurrent.ConcurrentDictionary`2[[System.String, mscorlib],[SignalR.Infrastructure.LockedList`1[[System.Action`1[[System.Collections.Generic.IList`1[[SignalR.InMemoryMessage`1[[System.UInt64, mscorlib]], SignalR]], mscorlib]], mscorlib]], SignalR]])->
0000000237580080(System.Object[])
RSP:57ae190:Root: 000000012ace9ea8(SignalR.Hubs.HubDispatcher+<>c__DisplayClass1a`1[[SignalR.Hubs.IDisconnect, SignalR]])->
0000000185a13640(SignalR.Hubs.HubDispatcher)->
000000011f655ed0(SignalR.InProcessMessageBus)->
000000011f656680(System.Collections.Concurrent.ConcurrentDictionary`2[[System.String, mscorlib],[SignalR.Infrastructure.LockedList`1[[System.Action`1[[System.Collections.Generic.IList`1[[SignalR.InMemoryMessage`1[[System.UInt64, mscorlib]], SignalR]], mscorlib]], mscorlib]], SignalR]])->
0000000237580080(System.Object[])
RSP:57ae1a0:Root: 000000012acea438(MyApp.Newsfeed.Hubs.NewsfeedHub)->
000000012acea5f8(SignalR.GroupManager)->
0000000185a17328(SignalR.Connection)->
000000011f655ed0(SignalR.InProcessMessageBus)->
000000011f656680(System.Collections.Concurrent.ConcurrentDictionary`2[[System.String, mscorlib],[SignalR.Infrastructure.LockedList`1[[System.Action`1[[System.Collections.Generic.IList`1[[SignalR.InMemoryMessage`1[[System.UInt64, mscorlib]], SignalR]], mscorlib]], mscorlib]], SignalR]])->
0000000237580080(System.Object[])
在我的应用程序中,我在ConcurrentDictionary中保留一个客户端列表并删除客户端对象,如下所示:
Newsfeed.ClientList.TryRemove(fromHubClient.Key, out newsfeedClient);
我看不出任何错误,并看到许多对SignalR.Infrastructure.LockedList
1的引用[[System.Action 1[[System.Collections.Generic.IList
1 [[SignalR.InMemoryMessage 1[[System.UInt64, mscorlib]], SignalR]], mscorlib]], mscorlib]], SignalR]
是否仍然存在一些带有SignalR内存泄漏的内存?
答案 0 :(得分:1)
SignalR 0.5.3中存在内存泄漏。我们目前处于1.0 alpha2,因此您可能希望更新以使用最新版本。