【问题标题】:Is restarting the App Domain enough to clear memory for OutOfMemoryException?重新启动 App Domain 是否足以清除 OutOfMemoryException 的内存?
【发布时间】:2014-01-20 22:40:05
【问题描述】:

关于如何回收 App Pool 和重启 App Domain 有很多问题。它们与我的场景有点不同。

我的应用程序池中只有应用程序域。如果抛出OutOfMemoryException,我正在尝试使用以下代码自动重新启动App Domain。

HttpRuntime.UnloadAppDomain(); 

问题:

According to my understanding of this SO anwser,我的应用池中只有一个应用域。所以清空App Domain应该和清空App Pool一样因为我只需要清空一个内存区域

或者我还需要像this这样清除应用程序池吗?

【问题讨论】:

  • 有趣的问题,但如果我有类似的问题,我会开始担心 - OutOfMemoryException 根本不应该发生......如果我必须编写代码来处理它,这不是表明真的有什么事情吗?发生了错误?
  • 我害怕你试图掩盖一个更大的问题。
  • OutOfMemoryException 有时由于遗留代码而发生。我们很快就会迁移到新的 64 位服务器。与此同时,我们需要做点什么。
  • OOM 异常是您的应用程序内存泄漏的症状。我认为你应该尝试追踪它。迁移到 64 位服务器并不能真正解决这个问题,你所做的只是延迟问题。

标签: c# asp.net


【解决方案1】:

如果您是由托管“泄漏”(忘记对来自各种缓存/静态集合的托管对象的引用)引起的 OOM,那么重新启动 AppDomain 可能会解决问题。

如果您因本地分配/加载的 DLL 对 32 位地址空间的碎片造成 OOM,则不太可能通过 AppDomain 回收来修复。

确实,从长远来看,您需要从根本上解决问题,短期内 IISreset 可能更可靠。

【讨论】:

    【解决方案2】:

    “回收”应用程序池与重置应用程序域的结果相同,只是应用程序池重新启动会关闭一个域并启动另一个域。所以结果将是正在运行的应用程序域不会接受任何新请求,但会完成它接受的所有请求。一个新的进程和应用程序域将启动并接受任何新请求。最终用户不应注意到任何中断。将其与有效终止进程和其中包含的所有应用程序域的 IIS 重置进行比较,即蛮力。

    但是 OutOfMemory 异常是更大问题的征兆。我假设您知道这不是解决方案。

    【讨论】:

    • 嗯,据我所知,就操作系统而言 - 应用程序池是一个进程(aspnet_wp,w3wp),而 AppDomain 只是该进程逻辑的一部分。并且 App Pool 重启是进程的重启,而不仅仅是 AppDomains。所以,如果有一些非托管的内存泄漏,那么 AppDomain 卸载将无济于事,在这种情况下只有 AppPool 重启应该有帮助
    • 我说错了,我的回答应该是在“回收”应用程序池时。
    • 我说的和你的评论没有什么不同,所以我不知道你的意思是什么。我的回答是解释应用程序池回收和重启之间的区别,最终进程结束并重新开始。
    • 原来你说的是AppPool重启,不是recycling,所以我刚才评论说不一样,AppPool重启会重启整个过程,Recycle不会重启。但是在你编辑之后,一切都很好:)
    猜你喜欢
    • 1970-01-01
    • 2011-04-13
    • 2023-04-11
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多