我们有一个在5个(服务器)节点(16个内核,每个128 GB内存)上运行的应用程序,该应用程序在每台计算机上加载近70 GB的数据。此应用程序是分布式的,并为并发客户端提供服务,因此,存在大量的套接字用法。类似地,对于多个线程之间的同步,有几种同步技术正在使用,主要是使用System.Threading.Monitor
。
现在的问题是,当应用程序正在运行并且数据在这些服务器节点之间以及客户端和服务器之间传输时,即使仍有40%以上的可用内存,一台或两台服务器计算机也开始接收OutOfMemoryException
。我们感觉到此异常来自非托管代码。尽管我们没有直接进行任何非托管调用,但是我们已经看到,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,但这似乎无济于事。
任何帮助,将不胜感激..
编辑:
以下是更多详细信息;
AllowLargeObject
标志已设置。 EDIT2:请注意,这不是内存泄漏。 70 GB的进程大小在此处有效。
最佳答案
其他用户提出的一些初步问题很酷,但是您是否考虑过懒惰并分析应用程序?
我可以想到Redgate的Ants profiler或JetBrains的dotmemory,下面是链接。
http://www.red-gate.com/products/dotnet-development/ants-memory-profiler/
https://www.jetbrains.com/dotmemory/
关于c# - 当有大量可用内存时出现OutOfMemoryException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27247118/