Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何处理外部DLL中的内存泄漏_.net - Fatal编程技术网

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

.net 如何处理外部DLL中的内存泄漏,.net,.net,我有一个用于应用程序的外部(.Net)dll。不幸的是,dll有几个已知的内存泄漏。我们正在努力让dll的作者修复内存泄漏,但与此同时,我想知道在不必处理内存泄漏的情况下使用dll的最佳方式是什么 除非它被混淆,否则使用.NET Reflector并取出代码,找到相关部分,修复它,重新编译它,然后使用重新编译的代码 这可能适用于您的环境,也可能不适用于您的环境。当我必须弄清楚如果一些供应商拒绝我的文档,如何与他们进行交互时,这对我很有用。但请记住,使用.NET Reflector时,您的企业可能

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

除非它被混淆,否则使用.NET Reflector并取出代码,找到相关部分,修复它,重新编译它,然后使用重新编译的代码


这可能适用于您的环境,也可能不适用于您的环境。当我必须弄清楚如果一些供应商拒绝我的文档,如何与他们进行交互时,这对我很有用。但请记住,使用.NET Reflector时,您的企业可能会遇到问题。

我不知道这是否一定适用于.NET,但您能否卸载DLL并重新连接它?这将导致已用内存(包括泄漏内存)的取消分配,然后重新加载库并返回您的快乐之路。 找到卸载DLL的时间显然很棘手。;)

相关链接似乎是:


我们有一个使用第三方库(用Java开发)的服务,我们认为该库存在内存泄漏。我们认为处理这个问题的简单方法是将服务分为两个不同的模块,一个是服务本身,另一个是包含业务代码的可执行文件。因此,服务循环,调用另一个可执行文件,该文件在其自己的内存空间中运行,然后完成其执行,而不会因为内存泄漏而对服务应用程序产生争议


因此,我的建议是将您的程序与故障DLL隔离开来,或者缩短您使用它的时间,或者更改系统的体系结构,这样您就不会直接从“长时间运行”的应用程序处理此DLL。

如果这是一个严重问题,将程序集加载到一个单独的AppDomain中,并单独创建狡猾类的实例。它还提供了一个很好的安全边界

如果存在持有变量的静态成员,那么对于当前appdomain中的泄漏您将无能为力,因此使用另一个成员是提供组件隔离的一个好方法


一旦程序集加载到IAppDomain中,它就无法卸载,但整个AppDomain都可以被拆除,GC将收集它。

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

如果资源归负责的.Net托管对象所有,该对象在IDispose.Close()中释放其非托管句柄,但某些bonehead代码没有在应该调用IDispose.Close时调用IDispose.Close,则强制GC循环或卸载程序集的AppDomain可能有助于通过“加快”回收这些孤立的非托管资源拥有的托管对象的最终GC处置

如果句柄属于bonehead代码,而该代码根本不能正确释放它们,则卸载程序集的AppDomain不太可能有助于回收孤立的句柄

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


绝对坚持最后一个想法,作为绝对的最后手段。试着找出哪种内存或资源正在泄漏,以及泄漏的方式,以及AppDomain循环是否会回收丢失的资源。

是的,我想我应该提到这不是一个选项,但反射器将是我们识别泄漏的方式。出于各种原因,编写我自己的版本在这里不起作用。基本上,问题是我们在哪里部署它,生产服务器已经有了我们将要使用的组件的实例,我们无法触及该实例(因为它正在生产中)。这是一个内部问题,可能会在我们到达那里之前得到解决,但我很好奇在此期间如何处理这个问题。特别是这个dll正在打开一个SqlConnection,并且永远不会关闭它。