2013-05-10 48 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