管理的+;非托管应用程序导致内存泄漏 我有一个COM组件(.NET)在COM组件(使用VB6创建)中,其中COM组件也使用本机C++ DLL。p>

管理的+;非托管应用程序导致内存泄漏 我有一个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) 是否有其他

应用程序作为后台进程运行,并且应该24 X 7连续运行。 应用程序在一定时间内运行正常,但在一定时间后崩溃。 可能的原因可能是C++ C++语言中的MMORION泄漏或COM组件。COM和C++的DLL有很多代码。 <>因为我不熟悉COM和C++,所以我试图从托管应用程序中解决这个问题。我正在考虑这样解决问题:如果托管应用程序开始消耗大量内存,那么我将重新启动托管应用程序

1) 我们如何以编程方式监控应用程序使用的总内存(托管+非托管)

2) 重新启动托管应用程序也会释放非托管资源

3) 是否有其他替代方法

4) 监视同时使用非托管资源的托管应用程序的最佳调试工具是什么

如果我的解释不清楚,请再问我一次

任何帮助都将不胜感激

我们如何以编程方式监控应用程序使用的总内存(托管+非托管)

使用性能计数器。在开发/测试中,最容易使用
PerfMon
在后台收集数据(使用数据收集集),然后在Excel或类似软件中分析结果

如果需要在生产使用中继续此操作,应用程序可以读取性能计数器本身(使用
System.Diagnostics.PerformanceCounter
和相关类)

2) 重新启动托管应用程序也会释放非托管资源

3) 是否有其他替代方法

是:解决问题

<>如果COM组件或C++库真的泄漏,那么那些确实需要修复(如果以前只用于短时间进程,泄漏可能已经存在很长时间了)。 您可能遇到了.NET托管堆和GC使用本机堆的交互。托管GC在内存压力下运行(即,否则需要获取更多内存才能完成分配)。如果托管包装器没有分配内存(或分配的内存不多),那么它就没有理由运行GC。当您从.NET引用COM组件时,引用保存在本机包装器类型中,此包装器在GC收集COM实例时释放COM实例(通过释放最后计数的COM引用)

因此,如果GC没有运行,那么COM组件将不会被释放。COM实例只需使用大量内存,整个进程内存提交就会开始增长

有三种方法(减少偏好):

  • 使用COM实例上的方法释放其内存使用(例如释放子对象)(如果有)
  • 当托管代码使用完COM组件实例后,显式释放它们,而不必等待GC使用
  • 强制执行GC
  • #3是最简单的,可以通过在运行数小时(例如,在计时器上)并查看内存使用性能计数器后强制执行完整GC来确认此方法。如果是这种情况,则继续执行#1或#2

    (这基本上是在我的第一个.NET项目中发生的,大量非托管堆的交互阻止了托管实例释放,该实例由于缺少托管内存压力而未被收集。在这种情况下,修复方法是向关键COM组件添加一个附加方法,以释放它所持有的对象。)