我们有一个调用.NET动态链接库的VB6应用程序。偶尔,在VB6应用程序运行了很长时间并多次调用.NET代码后,.NET端会抛出OutOfMemory异常,即使机器上有大量可用内存也是如此。VB6内存空间也没有接近它的极限。
.NET端是否有单独的内存池?或者它是VB6应用程序内存池的一部分?
如果它是独立的,有没有办法看看它有多大?我的任务管理器中唯一巨大的内存项是SQL Server和VB6应用程序(这两个都是预期的)。
这种情况并不经常发生,但是当它发生时,很难确定为什么系统不分配更多的内存。
发布于 2010-01-26 05:02:08
答案最终非常简单:
使用调试配置构建的.NET DLL将在运行时泄漏。
切换到发布版本修复了我的问题。
背景:
我最终让ANTS调试了VB6应用程序,并查看了.NET进程(必须尽快更改VB6代码以加载.NET代码)。一旦我这样做了,我看到了大量的弱引用对象,它们的父对象是__ENCList。此类允许在调试期间编辑并继续。在Google上快速搜索一下就会发现这是由于使用了调试版本造成的。
My Google Search
链接:
WeakReferences in Debug Build
发布于 2009-11-15 08:22:08
它看起来像是某个地方的内存泄漏,假设dll和调用应用程序是正确的,它可能在调用中。检查参数数据类型,以及byref和byval。.net中的参数默认为byval,vb6中的参数为byref。每种类型中都有不同的字符串类型,并不总是在调用库时正确转换。
发布于 2009-11-13 01:12:26
首先要检查的是内存中对象的固定。在多线程环境中,这可能很快就会失控,这取决于代码的编写方式。当.NET去获取更多的内存时,它将以8 MB、16 MB或32 MB的块来获取内存,这些块需要完全清理。也就是说,您可能有数百MB的空闲内存,但如果没有32 MB的空闲块,其中没有任何其他内容,那么您将得到您所看到的OOM。我强烈建议使用诸如at之类的内存分析器,并仔细观察这些情况。
https://stackoverflow.com/questions/1723797
复制相似问题