2

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.LockedList1 [[System.Action 1[[System.Collections.Generic.IList1[[SignalR.InMemoryMessage1[[System.UInt64, mscorlib]], SignalR]], mscorlib]], mscorlib]], SignalR]

SignalRでリークメモリを含むメモリはまだありますか?

4

1 に答える 1

1

SignalR0.5.3にメモリリークがあります。現在1.0alpha2であるため、最新のものを使用するように更新することをお勧めします。

于 2012-11-17T10:38:04.473 に答える