【发布时间】:2021-11-15 15:38:40
【问题描述】:
您好,我在 wpf 中创建了一个窗口。 这是一个打印预览屏幕。 它在 DocumentViewer 中显示 (FixedDocumentSequence)。 FixedDocumentSequence 是由 Flow Document 使用动态绑定创建的。
单个窗口占用近500MB。 每次内存泄漏大约 100MB。 如果打开超过 5 或 10 次内存溢出 1GB。
我在 STA 线程(不是 UI 线程)中打开窗口。执行 Dispatcher 关闭方法。但是有些对象没有从内存中释放。(调度程序关闭后内存对象仍然存在?)
我已经使用 WinDbg 检查内存泄漏,Flow 文档部分仍然显示。
!dumpheap -stat
我检查对象的根。但它显示“找到 0 个唯一根”
!gcroot [address]
我的英语可能不太理解问题的意思。
[问题1]请给我一些解决内存泄漏的建议。
(另外一个信息和问题:
我也想尝试在 dispose 方法中设置 null。
GC 终结器从另一个线程调用析构函数。 所以运行时看不到对象的值,也不能在 dispose 方法中将值设置为 null。
[问题 2] 我已经关闭了调度程序。那么有必要在 Dispose(bool disposing) 方法中实现什么吗?)
【问题讨论】:
-
如果您的对象没有根,那么它不太可能是内存泄漏。可能只是 GC 还没有回收内存。尝试运行
GC.Collect(2)看看会发生什么 -
GC.Collect(2) 可以帮助一些更好的东西。谢谢。手动 Dispose 一些对象,然后在 ShutDown 之后,Thread sleep 1secod,然后调用 GC.Collect(2)。解决了 90%。
标签: wpf memory-leaks windbg flowdocument