CLR 内存不足异常

2024-01-21

我们遇到了很多内存不足的异常,但我们似乎无法诊断发生了什么。这似乎是一个在几分钟内内存使用量从 300 MB 飙升至超过 1 GB 的问题。现在这是一个IIS https://en.wikipedia.org/wiki/Internet_Information_Services应用程序并具有三个应用领域 https://en.wikipedia.org/wiki/Application_domain在单独的线程池中运行。

我们想要记录当memory例外即将发生。所以我们可以尝试寻找一种模式。做这个的最好方式是什么?

有没有办法query the memory每分钟使用一次,查看其使用量有多高并发送警报电子邮件。或者编写一个应用程序来监视 CLR 的内存使用情况?非常欢迎您提出想法或方向。

我在用性能监视器 https://en.wikipedia.org/wiki/Performance_Monitor,但除非我正在观察这个过程,否则它没有那么有用。我只能看到过去是什么以及何时发生。我还使用了 Red Gate Memory Profile 工具,顺便说一句,它非常棒 - 只是我似乎无法找到导致异常的页面或进程。


在您的服务器上安装 ADPlus(它是Windows 调试工具 https://web.archive.org/web/20110217084226/http://www.microsoft.com:80/whdc/devtools/debugging/default.mspx)。当您开始观察异常高的内存使用率时,使用以下命令捕获内存转储:

adplus -hang -p <PID> -quiet -o <dump file folder path>

<PID>是工作进程的进程ID,您可以从中获取tasklist.exe.

如果发生此问题时您并不总是在场,那么您可以使用以下命令自动捕获内存转储调试诊断 http://www.microsoft.com/downloads/details.aspx?FamilyID=28bd5941-c458-46f1-b24d-f60151d875a3:

  1. 当您的专用或虚拟内存使用达到特定阈值时,在泄漏跟踪模式下使用 DebugDiag 来触发进程转储。也就是说,我并不总是觉得这可靠。

  2. 每当抛出 CLR 异常时,在崩溃模式下使用 DebugDiag 来捕获转储。您可以使用“高级设置”将 DebugDiag 配置为在遇到以下类型的 CLR 异常时生成完整内存转储:System.OutOfMemoryException。这样比较靠谱,肯定会触发。仅使用“高级设置”->“例外”,不要触摸“未配置的第一次机会例外”,将此设置保留为“无”。

获得内存转储后,启动 WinDBG,然后加载转储文件并加载 SOS 并开始查看。

苔丝费兰德斯的blog https://web.archive.org/web/20120314124205/http://blogs.msdn.com/b/tess/是一个很棒的 .NET 调试资源,她有大量关于如何跟踪内存泄漏的文章和实验(这些是 archive.org 链接,由于链接已损坏):

如果它坏了,你应该修复它 - 内存问题文章 https://web.archive.org/web/20120323022809/http://blogs.msdn.com/b/tess/archive/tags/memory+issues/

.NET调试演示实验六:_内存泄漏 https://web.archive.org/web/20120511182250/http://blogs.msdn.com/b/tess/archive/2008/03/17/net-debugging-demos-lab-6-memory-leak.aspx
.NET 调试演示实验 6:_内存泄漏 - 回顾 https://web.archive.org/web/20120830180042/http://blogs.msdn.com/b/tess/archive/2008/03/17/net-debugging-demos-lab-6-memory-leak-review.aspx
.NET 调试演示实验 7:内存泄漏 https://web.archive.org/web/20120304170614/http://blogs.msdn.com/b/tess/archive/2008/03/25/net-debugging-demos-lab-7-memory-leak.aspx
.NET 调试演示实验 7:内存泄漏 - 回顾 https://web.archive.org/web/20120418043130/http://blogs.msdn.com/b/tess/archive/2008/04/03/net-debugging-demos-lab-7-memory-leak-review.aspx

PerfMon 计数器很有用,可用于确认是否存在内存泄漏,但它们并不能说明全部情况。 WinDBG 和 SOS 是您需要用来找出内存使用情况的工具。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CLR 内存不足异常 的相关文章

随机推荐