加入收藏 | 设为首页 | 会员中心 | 我要投稿 孝感站长网 (https://www.0712zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 系统 > 正文

.net – 如何处理外部DLL中的内存泄漏

发布时间:2021-02-20 12:20:55 所属栏目:系统 来源:网络整理
导读:我有一个外部(.Net)DLL我必须用于一个应用程序.不幸的是,dll有几个已知的内存泄漏.我们正在努力让dll的作者修复内存泄漏,但同时我想知道在不必处理内存泄漏的情况下使用dll的最佳方法是什么? 解决方法 将.Net程序集移动到自己的AppDomain中,以便定期卸载模

我有一个外部(.Net)DLL我必须用于一个应用程序.不幸的是,dll有几个已知的内存泄漏.我们正在努力让dll的作者修复内存泄漏,但同时我想知道在不必处理内存泄漏的情况下使用dll的最佳方法是什么?

解决方法

将.Net程序集移动到自己的AppDomain中,以便定期卸载模块可能会有所帮助,如果泄漏是由于挂起到对象引用“太长”,但我遇到的大多数“内存泄漏”情况.Net托管代码实际上是无法释放非托管资源句柄 – 释放句柄,关闭文件,关闭网络连接等.

如果资源由负责的.Net托管对象拥有,该对象在IDispose.Close()中释放其非托管句柄,但某些骨头代码在调用时不会调用IDispose.Close,强制执行GC循环或卸载程序集的AppDomain可能帮助回收那些孤立的非托管资源,方法是“赶紧”对拥有的托管对象进行最终的GC处理.

如果句柄由不能正确释放它们的bonehead代码拥有,则卸载程序集的AppDomain不太可能帮助回收孤立的句柄.

与进程关联的大多数Windows资源将在进程终止时恢复.这有点极端,但如果GC和AppDomain循环没有帮助,您可以编写一个包含有问题的.NET程序集类的包装器,并使用.NET远程处理从您的进程中完全抛弃有问题的程序集.违规程序集的类与应用程序的其余部分之间的数据交互量将决定这是否完全可行.如果违规组件是相当自包含的,具有少量接口入口点,则这可能是可行的.由于违规组件处于自己的过程中,您可以定期关闭它以清除累积的残余物,而无需关闭您自己的过程.

绝对坚持最后的想法是绝对的最后手段.尝试找出泄漏的内存或资源类型以及泄漏方式以及AppDomain循环是否会回收丢失的资源.

(编辑:孝感站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读