3

我们有一个调用 .NET DLL 的 VB6 应用程序。有时,在 VB6 应用程序运行了很长时间并多次调用 .NET 代码之后,.NET 方面会抛出 OutOfMemory 异常,即使机器上有足够的可用内存。VB6 内存空间也没有接近极限。

.NET 端是否保留单独的内存池?或者它是 VB6 应用程序的内存池的一部分?

如果是分开的,有没有办法看它有多大?我的任务管理器中唯一的大内存项目是 SQL Server 和 VB6 应用程序(两者都是预期的)。

这种情况不会经常发生,但一旦发生,就很难确定系统为什么不分配更多内存。

4

4 回答 4

1

这似乎是某处的内存泄漏,假设 dll 和调用应用程序是正确的,它可能在调用中。检查参数数据类型,以及 byref 与 byval。.net 中的参数默认为 byval,在 vb6 中为 byref。每种字符串类型都有不同的字符串类型,它们在调用库时并不总是正确转换。

于 2009-11-15T00:22:08.157 回答
1

答案很简单:

使用 DEBUG 配置构建的 .NET DLL 在运行时会泄漏。

切换到 RELEASE 版本解决了我的问题。

背景:

我终于让 ANTS 调试 VB6 应用程序并查看 .NET 进程(必须更改 VB6 代码以尽快加载 .NET 代码)。一旦我这样做了,我就会看到大量的弱引用对象,其父对象是 __ENCList。此类允许在调试期间进行编辑和继续。快速的 Google 搜索立即显示这是由使用 DEBUG 构建引起的。

我的谷歌搜索

链接:

调试构建中的弱引用

于 2010-01-25T21:02:07.773 回答
0

首先要检查的是内存中对象的固定。在多线程环境中,这可能会很快失控,具体取决于代码的编写方式。当 .NET 去获取更多内存时,它将占用 8、16 或 32 MB 的块,并且这些块需要完全干净。也就是说,您可能有数百 MB 的空闲内存,但如果没有 32 MB 的空闲块,其中没有任何其他内容,那么您将获得您所看到的 OOM。我强烈建议使用诸如 ANTS 之类的内存分析器并仔细研究一下。

于 2009-11-12T17:12:26.337 回答
0

这个错误通常应该被解读为GDI Objects之外的错误。检查任务管理器进程选项卡中的 GDI/Handles 计数器或使用GDIView

于 2009-11-12T17:46:51.837 回答