当大量内存可用时OutOfMemoryException

  发布于 2022-12-08 17:19

我们有一个应用程序在5个(服务器)节点(16个核心,每个128 GB内存)上运行,每台机器上加载近70 GB的数据.此应用程序是分布式并为并发客户端提供服务,因此,有很多套接字使用.类似地,对于多个线程之间的同步,使用了一些同步技术,主要使用System.Threading.Monitor.

现在的问题是,当应用程序正在运行且数据在这些服务器节点之间以及客户端和服务器之间传输时,OutOfMemoryException即使有40 +%的内存仍然可用,一台或两台服务器机器也会开始接收.我们感觉这个异常来自非托管代码.虽然,我们没有直接进行任何非托管调用,但我们已经看到OOM异常堆栈跟踪中的最后一次调用始终是一个内部调用非托管代码的框架调用.

以下是几个例子.

Exception of type 'System.OutOfMemoryException' was thrown.
   at System.Threading.Monitor.ObjPulseAll(Object obj)
   ....

Exception of type 'System.OutOfMemoryException' was thrown.
   at System.Threading.Monitor.ObjWait(Boolean exitContext, Int32 millisecondsTimeout, Object obj)
   at System.Threading.Monitor.Wait(Object obj, TimeSpan timeout)
   ....

关于造成这个问题的原因,我们在此毫无头绪.我们已经多次在这些机器上引发GC,但这似乎也没有帮助.

任何帮助,将不胜感激..

编辑:

以下是一些更多细节;

应用程序在x64进程中运行.

Windows Server 2012 R2

.NET Framework 4.5

服务器GC已启用

AllowLargeObject 标志设置.

编辑2:请注意,这不是内存泄漏.70 GB的流程大小在此处有效.

2 个回答
  • 即使非托管代码存在内存泄漏,如果有40%可用内存,也应该能够分配对象.我在想的是这是一个碎片问题,而不是内存泄漏.

    1-您尝试以大块或小块分配的数据吗?

    2-您是否尝试强制使用垃圾收集器(通过调用GC.Collect())?垃圾收集不仅可以释放内存,还可以压缩它来消除碎片.

    2022-12-11 02:14 回答
  • 其他用户建议的一些初步问题很酷,但您是否考虑过懒惰并分析您的应用?

    我可以想到Redgate的蚂蚁剖析器或JetBrains的dotmemory,下面的链接.

    http://www.red-gate.com/products/dotnet-development/ants-memory-profiler/

    https://www.jetbrains.com/dotmemory/

    2022-12-11 02:55 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有