【问题标题】:Microsoft UCMA: Strings Not Being Garbage CollectedMicrosoft UCMA:字符串未被垃圾收集
【发布时间】:2013-05-10 12:04:27
【问题描述】:

我在我的 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 )

【问题讨论】:

    标签: c# wcf sip rtc ucma


    【解决方案1】:

    垃圾回收不是由some time of inactivity 触发的。在内存中看到大量字符串或任何其他类的实例并没有错。并且永远不会收集实习字符串(编译时常量)。

    在出现 Out-Of-Memory 异常之前不会发生内存泄漏。

    【讨论】:

    • 但是如果你看到内存增加了……嗯,不是因为那个过程而下降呢? ...当您分析该过程时...您会从您拍摄的快照中看到 3000 个新实例,并将其与首次运行时的快照进行比较,并且...在一天后的 Gen #2 Garbage Collect 调用之后当没有更多活动时,您看到只有 50 个 String 类型的实例已被清理,其余的只是坐在内存中并占用数百 MB 的 RAM,在任务管理器中很容易查看?这不是内存泄漏吗?
    • 没有。 GC 甚至不可能发生真正的内存泄漏。您可能对引用管理不善,但这是程序逻辑的问题。只要看不到OOM,有什么问题?内存既便宜又虚拟。
    猜你喜欢
    • 1970-01-01
    • 2013-02-25
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多