首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VB6应用程序调用.NET DLL OutOfMemory异常

VB6应用程序调用.NET DLL OutOfMemory异常
EN

Stack Overflow用户
提问于 2009-11-13 01:06:12
回答 4查看 982关注 0票数 3

我们有一个调用.NET动态链接库的VB6应用程序。偶尔,在VB6应用程序运行了很长时间并多次调用.NET代码后,.NET端会抛出OutOfMemory异常,即使机器上有大量可用内存也是如此。VB6内存空间也没有接近它的极限。

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

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

这种情况并不经常发生,但是当它发生时,很难确定为什么系统不分配更多的内存。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-01-26 05:02:08

答案最终非常简单:

使用调试配置构建的.NET DLL将在运行时泄漏。

切换到发布版本修复了我的问题。

背景:

我最终让ANTS调试了VB6应用程序,并查看了.NET进程(必须尽快更改VB6代码以加载.NET代码)。一旦我这样做了,我看到了大量的弱引用对象,它们的父对象是__ENCList。此类允许在调试期间编辑并继续。在Google上快速搜索一下就会发现这是由于使用了调试版本造成的。

My Google Search

链接:

WeakReferences in Debug Build

票数 1
EN

Stack Overflow用户

发布于 2009-11-15 08:22:08

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

票数 1
EN

Stack Overflow用户

发布于 2009-11-13 01:12:26

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1723797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档