Silverlight 4.0 Internet Explorer 9 Silverlight 4内存泄漏

Silverlight 4.0 Internet Explorer 9 Silverlight 4内存泄漏,silverlight-4.0,internet-explorer-9,ihttpasynchandler,mediastreamsource,umdh,Silverlight 4.0,Internet Explorer 9,Ihttpasynchandler,Mediastreamsource,Umdh,我们正在将视频从实现IHTTPassynchandler的ashx流式传输到Silverlight客户端 在客户端,异步处理程序正在MediaStreamSource的实现中使用 它在最新的Firefox、chrome和InternetExplorer8中运行良好 但在InternetExplorer9中,我们看到内存泄漏。我一直在使用umdh调试内存,并发现一个调用堆栈在转储内存之间使用了127mb。所以我想我已经把范围缩小到这个调用堆栈了 但现在我不知道如何继续调试。以下是umdh信息: 第

我们正在将视频从实现IHTTPassynchandler的ashx流式传输到Silverlight客户端

在客户端,异步处理程序正在MediaStreamSource的实现中使用

它在最新的Firefox、chrome和InternetExplorer8中运行良好

但在InternetExplorer9中,我们看到内存泄漏。我一直在使用umdh调试内存,并发现一个调用堆栈在转储内存之间使用了127mb。所以我想我已经把范围缩小到这个调用堆栈了

但现在我不知道如何继续调试。以下是umdh信息:

第一次运行与第二次运行之间的比较

+ 117440512 ( 134217712 - 16777200)      1 allocs   BackTrace121282BC
+       0 (      1 -      1)    BackTrace121282BC   allocations

ntdll!RtlAllocateHeap+00000274
npctrl!???+00000000 : 56FE1A65
npctrl!DllCanUnloadNow+000157F0
npctrl!???+00000000 : 56FF477E
npctrl!???+00000000 : 56FF48D5
urlmon!CBSCHolder::OnDataAvailable+0000003A
urlmon!CBinding::CallOnDataAvailable+0000002B
urlmon!CBinding::OnDataNotification+000000D7
urlmon!CBinding::OnTransNotification+000001DB
urlmon!CBinding::ReportData+00000085
urlmon!COInetProt::ReportData+0000006E
mscorie!CorFltr::ReportData+0000002B
urlmon!CTransaction::DispatchReport+0000037A
urlmon!CTransaction::OnINetCallback+000000DB
urlmon!TransactionWndProc+00000028
USER32!InternalCallWinProc+00000023
USER32!UserCallWinProcCheckWow+00000109
USER32!DispatchMessageWorker+000003BC
USER32!DispatchMessageW+0000000F
IEFRAME!CTabWindow::_TabWindowThreadProc+00000722
IEFRAME!LCIETab_ThreadProc+00000317
iertutil!CIsoScope::RegisterThread+000000AB
IEFRAME!Detour_DefWindowProcA+0000006C
kernel32!BaseThreadInitThunk+0000000E
ntdll!__RtlUserThreadStart+00000070
ntdll!_RtlUserThreadStart+0000001B
第二次运行callstack

+ 7fffff0 ( 7fffff0 -     0)      1 allocs  BackTrace121282BC
+       1 (     1 -     0)  BackTrace121282BC   allocations

ntdll!RtlAllocateHeap+00000274
npctrl!???+00000000 : 56FE1A65
npctrl!DllCanUnloadNow+000157F0
npctrl!???+00000000 : 56FF477E
npctrl!???+00000000 : 56FF48D5
urlmon!CBSCHolder::OnDataAvailable+0000003A
urlmon!CBinding::CallOnDataAvailable+0000002B
urlmon!CBinding::OnDataNotification+000000D7
urlmon!CBinding::OnTransNotification+000001DB
urlmon!CBinding::ReportData+00000085
urlmon!COInetProt::ReportData+0000006E
mscorie!CorFltr::ReportData+0000002B
urlmon!CTransaction::DispatchReport+0000037A
urlmon!CTransaction::OnINetCallback+000000DB
urlmon!TransactionWndProc+00000028
USER32!InternalCallWinProc+00000023
USER32!UserCallWinProcCheckWow+00000109
USER32!DispatchMessageWorker+000003BC
USER32!DispatchMessageW+0000000F
IEFRAME!CTabWindow::_TabWindowThreadProc+00000722
IEFRAME!LCIETab_ThreadProc+00000317
iertutil!CIsoScope::RegisterThread+000000AB
IEFRAME!Detour_DefWindowProcA+0000006C
kernel32!BaseThreadInitThunk+0000000E
ntdll!__RtlUserThreadStart+00000070
ntdll!_RtlUserThreadStart+0000001B

你已经解决你的问题了吗

您是否检查过SL内存调试提示,例如:


我怀疑umdh对于分析CLR内存泄漏是否非常有用。由于.NET自行管理内存,CLR不会根据需要分配尽可能少的内存。相反,它会立即削减大量内存,以优化性能、碎片等。我会从.NET特定工具开始,比如ANTS memory Profiler,来确定哪些内存泄漏:托管还是非托管。在拍摄快照之前,您应该记住执行强制GC,否则您可能会在堆中观察到大量重影对象。