gpt4 book ai didi

c# - OutOfMemoryException 仅在发布时编译时抛出

转载 作者:太空狗 更新时间:2023-10-30 01:04:19 25 4
gpt4 key购买 nike

我有一个分配大量小对象和数组的 C# 控制台应用程序。这些对象的生命周期很短,很快就会被垃圾收集器清理干净。对于“为什么你需要分配这么多生命周期短的对象,你应该避免这种情况”的问题:该程序用于繁重的 AI 任务,目前没有明显的方法来解决这个问题.

问题是:

如果我在 x86 Debug模式下运行该程序,它运行良好并在几分钟后完成所有处理。平均而言,它使用 300-400 MB。

如果我采用完全相同的程序,但在发布 x86 模式下编译和运行它,程序使用的内存很快达到 2GB(几秒钟内),因此它抛出 OutOfMemoryException(这是预期的行为,因为它是 32 位应用程序)。在 release x64 模式下编译它根本没有解决问题,它很快就用完了计算机的所有内存 (8GB),然后在内存分配失败时崩溃。

我使用 SharpDevelop 4.3.3 构建应用程序。调试和 Release模式之间的唯一区别是:

  • 优化代码(仅发布)
  • 检查算术上溢/下溢(仅调试)
  • 调试信息:完整调试信息(调试)/无调试信息(发布)

在所有情况下都没有附加调试器。程序非常短,没有编译器指令,在调试或发布时编译时会使其运行不同。没有明显的理由来解释这种行为。在 Release模式下编译时,垃圾收集器似乎永远不会被触发(或者至少次数不够)并且内存也不会被释放。

好像是similar question已经有人问过,但它似乎与我的问题不同。

最佳答案

如果终于找到原因了。我的错。

我有一个 Debug.Assert() 方法调用,它不仅执行一些检查,还执行一些操作(例如:Debug.Assert(List.Remove())).

我假设 Debug.Assert() 在两种情况下(发布和调试)都被执行,结果值仅在 Debug模式下被测试,但这是错误的。在 Release模式下编译时,Debug.Assert() 调用完全从代码中移除。

我给出了答案但没有关闭问题,因为它可能对其他人有用。

关于c# - OutOfMemoryException 仅在发布时编译时抛出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23920997/

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