gpt4 book ai didi

C# 在调用耗费大量内存的 native 代码 DLL (Delphi) 后内存不足

转载 作者:行者123 更新时间:2023-11-30 18:23:41 24 4
gpt4 key购买 nike

我有一个 C# 应用程序,它执行一些零碎的操作,但它执行的主要任务是由它调用的 Delphi DLL 完成的。

这个 Delphi DLL 占用大量内存,需要在本地缓存大量 DB 信息以提高速度。我很高兴它没有泄漏,因为当代码在 Delphi 中运行时 FastMM4 没有报告任何内存泄漏。

但是,当控件返回到 C# 时,我开始遇到问题。 C# 代码尝试对 Delphi 应用程序的结果进行一些计算(所有结果都通过 DB 编码)。这些计算通常涉及一百万次左右的两倍,因此不会占用大量内存,但代码会不断返回内存不足异常。

我假设 Delphi 代码中的 FastMM4 仍未将释放的内存返回给 Windows(因此可用于 C# 代码),因此该进程仍在使用它的最大 32 位内存分配并且 C# 无法获得需要时更多。

那么,如何让 C# 代码再次使用 Delphi 使用(和释放)的内存?我想我们可能想要执行以下操作之一:

  • 强制从 C# 端卸载 Delphi DLL(我的同事认为这行不通,因为他认为它只会卸载代码而不是堆上使用的内存)- 可能是 LoadLibrary/FreeLibrary?
  • 在 Delphi DLL 的末尾进行调用以将内存释放回 Windows(我之前尝试过 SetWorkingProcessSetSize,但似乎没有做任何事情,我应该使用不同的调用吗?)
  • 将 Delphi DLL 包装在 C# DLL 中并在不同的 AppDomain 中调用它(从样式的角度来看我不喜欢这样,因为我们创建包装器只是为了保存包装器。
  • 还有什么我错过的吗?

最佳答案

Force an unload of the Delphi DLL from the C# side (my colleague doesn't think this will work, as he thinks it'll just unload the code rather than the memory used on the heap) - probably LoadLibrary/FreeLibrary?

这会起作用。当 DLL 卸载时,FastMM 将完成并返回它保留和提交的内存。

关于C# 在调用耗费大量内存的 native 代码 DLL (Delphi) 后内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32068094/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com