2013-05-10 29 views
1

我在我的UCMA應用程序上運行一個內存分析器,它作爲一個客戶端,將記錄參與者添加到會話中,我注意到很多字符串實例吃掉內存(即使參與者被刪除和閒置一段時間後,我發現這些字符串沒有得到收集的垃圾):微軟UCMA:字符串不被垃圾收集

Microsoft.Rtc.Collaboration!Microsoft.Rtc.Signaling.DiagnosticsInformation..ctor(int,DiagnosticVisibility) 
Microsoft.Rtc.Collaboration!Microsoft.Rtc.Signaling.DiagnosticsInformation.CreateOutgoingDiagnosticsInformation(uint) 
Microsoft.Rtc.Collaboration!Microsoft.Rtc.Collaboration.Call.SignalingSession_StateChanged(object,SignalingStateChangedEventArgs) 
Microsoft.Rtc.Collaboration!Microsoft.Rtc.Signaling.EventWorkitem<TEventArgs>.Process() 
Microsoft.Rtc.Collaboration!Microsoft.Rtc.Signaling.WorkitemQueue.ProcessItems() 
Microsoft.Rtc.Collaboration!Microsoft.Rtc.Signaling.SerializationQueue<T>.ResumeProcessing() 
Microsoft.Rtc.Collaboration!Microsoft.Rtc.Signaling.SerializationQueue<T>.ResumeProcessingCallback(object) 
Microsoft.Rtc.Collaboration!Microsoft.Rtc.Signaling.QueueWorkItemState.ExecuteWrappedMethod(WaitCallback,object) 
mscorlib!System.Threading.ExecutionContext.Run(ExecutionContext,ContextCallback,object) 
mscorlib!System.Threading._ThreadPoolWaitCallback.PerformWaitCallbackInternal(_ThreadPoolWaitCallback) 
mscorlib!System.Threading._ThreadPoolWaitCallback.PerformWaitCallback(object) 

我看到這樣的大約2000實例,他們沒有被清理。有沒有人看到過,並知道原因可能是什麼,或者如果這是框架本身的UCMA問題?

編輯:(?XML解串器對象沒有被清理),我也看到了很多的反序列化框架上

System.Xml!System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader,string,XmlDeserializationEvents) 
System.Xml!System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader,string) 
Microsoft.Rtc.Collaboration!Microsoft.Rtc.Signaling.XmlHelper.DeserializeObjectFragment(byte[],XmlSerializer) 
Microsoft.Rtc.Collaboration!Microsoft.Rtc.Collaboration.Conferencing.ConferenceJoinCommandResponse.TryProcessResponseCore(SipMessageData,ref RealTimeException) 
Microsoft.Rtc.Collaboration!Microsoft.Rtc.Collaboration.Conferencing.EstablishFocusSessionsAsyncResult.ParticipateCallback(IAsyncResult) 
Microsoft.Rtc.Collaboration!Microsoft.Rtc.Signaling.CompletionCallbackWorkItem.Microsoft.Rtc.Signaling.IWorkitem.Process() 
Microsoft.Rtc.Collaboration!Microsoft.Rtc.Signaling.WorkitemQueue.ProcessItems() 
Microsoft.Rtc.Collaboration!Microsoft.Rtc.Signaling.SerializationQueue<T>.ResumeProcessing() 
Microsoft.Rtc.Collaboration!Microsoft.Rtc.Signaling.SerializationQueue<T>.ResumeProcessingCallback(object) 
Microsoft.Rtc.Collaboration!Microsoft.Rtc.Signaling.QueueWorkItemState.ExecuteWrappedMethod(WaitCallback,object) 
mscorlib!System.Threading.ExecutionContext.Run(ExecutionContext,ContextCallback,object) 
mscorlib!System.Threading._ThreadPoolWaitCallback.PerformWaitCallbackInternal(_ThreadPoolWaitCallback) 
mscorlib!System.Threading._ThreadPoolWaitCallback.PerformWaitCallback(object) 

回答

1

垃圾收集不some time of inactivity觸發。在內存中查看大量字符串或其他類的實例沒有任何問題。並且interned字符串(編譯時間常量)永遠不會被收集。

直到出現內存不足異常時,纔會發生內存泄漏。

+0

但是,如果你看到記憶力上升......好吧,不是爲了這個過程而下降嗎? ...當你分析這個過程時......你看到你拍攝的快照中有3000個新實例,並與第一次運行時的快照進行比較,以及......在一天後的第二代垃圾收集調用之後當沒有更多的活動時,你會發現只有50個String類型的實例已經清除,其餘的只是坐在內存中並佔用數百MB的RAM,可以在任務管理器中輕鬆查看?這不是內存泄漏嗎? – Alexandru 2013-05-10 20:11:19

+1

編號實際的內存泄漏甚至無法使用GC。你可能會誤導你的引用,但這是程序邏輯的問題。只要你沒有看到OOM,那有什麼問題?內存便宜而且虛擬。 – 2013-05-10 20:19:19