2017-02-14 59 views
-2

我们有一个相当复杂的Delphi应用程序,它使用.NET程序集。 我们使用FastMM作为我们的内存管理器。Delphi Windows桌面应用程序 - > 513 MB内存使用启动 - > 32.1 MB后50分钟的空闲状态

我们已经遇到了EOutOfMemory异常。所以我一直在调查这一点。我们怀疑我们在Delphi对象之间有一些循环引用。或者也许一些.NET对象持有对Delphi对象的引用,从而阻止它们被释放。

到目前为止,我还没有发现任何可以改变的事情,这真的令人沮丧,因为显然我们在某个地方有问题。

但今天,我凭借纯粹的机会发现了一些东西。 当我们的应用程序启动任务管理器报告约。 513 MB正在使用的内存。 我刚刚启动它,但不得不离开午餐。 当我回来时,偶然发现应用程序现在只用了75 MB。 奇怪我以为,一定是坠毁或我假设的东西。不,完全没有,应用程序运行完美。 我做了什么 - >什么都没有。让它闲置。 我们的应用程序是一个Windows桌面应用程序。在空闲状态下没有太多的事情正在进行。

于是我开始进一步研究。 它是可重复的。随着时间的推移,内存消耗开始大幅下降。 后约。 50分钟已经达到32.1 MB!

我已经监视了.NET垃圾收集器性能计数器,并没有什么大的变化。因此,我怀疑问题在德尔福方面 - > FastMM上的哪一点。

虽然我不是FastMM的专家。我确信并且FullDebugMode未启用。 有没有其他人经历过这样的事情? 任何提示/想法FastMM内可能配置错误?

非常感谢!

+0

@DavidHeffernan你似乎有很多关于Delphi-内存管理器的经验。 :-)。如果您有任何类似的经验,您可以发表评论,非常感谢。谢谢! – santiagoIT

+4

您无法在此处向特定用户提出问题,并且您无法使用@符号对他们进行ping操作,除非他们先评论或者您正在评论他们的答案。这不是社交媒体网站,您也不会从您的首选用户那里获得个人技术支持。 –

+0

@KenWhite感谢您的信息!很高兴知道。希望他会遇到这个问题。我从其他SO问题中知道David使用他自己的MemoryManager并尝试了几次。所以他的投入会很有价值。 – santiagoIT

回答

1
  1. 的OS有时标识空闲应用的未使用的RAM,以释放它对于其它应用,则它不计数的任何更多的由该应用所消耗的资源。

  2. 在这样的混合应用程序中,我猜大多数内存都是由.Net框架保留的,因为它的垃圾收集器。 GC将以空闲模式运行,并释放/压缩其内存。这可能是发生了什么事。在您的应用中添加一些日志到monitor the actual FastMM4 heap consumption

  3. 可能存在内存泄漏,并且您达到了32位进程的2GB限制。尝试set the 3GB flag for the exe。或者切换到64位可执行文件 - 这会让你的.Net代码开心。运行FastMM4 in memory leak reporting mode以确保应用程序安全。

相关问题