管理的+;非托管应用程序导致内存泄漏 我有一个COM组件(.NET)在COM组件(使用VB6创建)中,其中COM组件也使用本机C++ DLL。p>
应用程序作为后台进程运行,并且应该24 X 7连续运行。 应用程序在一定时间内运行正常,但在一定时间后崩溃。 可能的原因可能是C++ C++语言中的MMORION泄漏或COM组件。COM和C++的DLL有很多代码。 <>因为我不熟悉COM和C++,所以我试图从托管应用程序中解决这个问题。我正在考虑这样解决问题:如果托管应用程序开始消耗大量内存,那么我将重新启动托管应用程序 1) 我们如何以编程方式监控应用程序使用的总内存(托管+非托管) 2) 重新启动托管应用程序也会释放非托管资源 3) 是否有其他替代方法 4) 监视同时使用非托管资源的托管应用程序的最佳调试工具是什么 如果我的解释不清楚,请再问我一次 任何帮助都将不胜感激 我们如何以编程方式监控应用程序使用的总内存(托管+非托管) 使用性能计数器。在开发/测试中,最容易使用管理的+;非托管应用程序导致内存泄漏 我有一个COM组件(.NET)在COM组件(使用VB6创建)中,其中COM组件也使用本机C++ DLL。p>,.net,memory-management,com-interop,.net,Memory Management,Com Interop,应用程序作为后台进程运行,并且应该24 X 7连续运行。 应用程序在一定时间内运行正常,但在一定时间后崩溃。 可能的原因可能是C++ C++语言中的MMORION泄漏或COM组件。COM和C++的DLL有很多代码。 因为我不熟悉COM和C++,所以我试图从托管应用程序中解决这个问题。我正在考虑这样解决问题:如果托管应用程序开始消耗大量内存,那么我将重新启动托管应用程序 1) 我们如何以编程方式监控应用程序使用的总内存(托管+非托管) 2) 重新启动托管应用程序也会释放非托管资源 3) 是否有其他
PerfMon
在后台收集数据(使用数据收集集),然后在Excel或类似软件中分析结果
如果需要在生产使用中继续此操作,应用程序可以读取性能计数器本身(使用System.Diagnostics.PerformanceCounter
和相关类)
2) 重新启动托管应用程序也会释放非托管资源
对
3) 是否有其他替代方法
是:解决问题
<>如果COM组件或C++库真的泄漏,那么那些确实需要修复(如果以前只用于短时间进程,泄漏可能已经存在很长时间了)。
您可能遇到了.NET托管堆和GC使用本机堆的交互。托管GC在内存压力下运行(即,否则需要获取更多内存才能完成分配)。如果托管包装器没有分配内存(或分配的内存不多),那么它就没有理由运行GC。当您从.NET引用COM组件时,引用保存在本机包装器类型中,此包装器在GC收集COM实例时释放COM实例(通过释放最后计数的COM引用)
因此,如果GC没有运行,那么COM组件将不会被释放。COM实例只需使用大量内存,整个进程内存提交就会开始增长
有三种方法(减少偏好):