重写我的问题,试图将其设为On-Topic:
我们有一个客户端(许多客户端中只有一个客户端)一直在使用我们的软件获得Out of Memory异常。我觉得我们已经消除了导致这种情况的常见嫌疑人,并且正在寻找可能导致OOM的其他事情(不太标准的原因)的想法。具体来说,由于这似乎是针对单个客户的,因此可能是由硬件,操作系统或.Net安装中的错误导致的吗?
以下是我所知道的导致OOM的事情以及为什么我认为我们已将其作为嫌疑人消除:
1 - 由系统内存不足引起的OOM。 为什么不?因为在发生这些异常时系统有几GB可用。
2 - 由于过度分配或内存泄漏导致进程内存不足导致的OOM。 为什么不?因为该过程在异常时仅使用大约100MB的内存。我们已经监视了几天的内存使用情况(在相关系统上)并且没有发现内存使用量有任何显着增加。
3 - 由于文件句柄等其他系统资源耗尽而导致的OOM 为什么不?例外情况是,在普通内存分配期间,而不是在打开文件或连接到套接字时发生。
4 - 尝试分配具有过多内存碎片的大型数组导致的OOM。 为什么不?我们分配的内存块相当小(大部分为640x480x2)。有了这么多可用的内存,我很难相信它可能会如此碎片化,以至于那样的东西会失败。
所以,为了清楚起见,我不是在问“为什么我的代码没有运行?”我的代码 在所有机器上运行,但只有一个。我不是要求任何人调试我的代码。我的问题是:“除了我们已经消除的原因之外,还有哪些其他可能的原因可能导致内存不足异常?”或者,“我是否遗漏了可能导致我过早消除其中一种已知原因的东西?”
答案 0 :(得分:1)
作为任何在类似问题上挣扎的人的一个FYI。我想我们终于找到了这个bug的原因。事实证明,某些更便宜的板载英特尔显卡上的OpenGL驱动程序与我们将位图数据一遍又一遍地写入相同纹理ID的方式存在问题。我更改了代码以删除纹理并每次分配一个新ID,问题似乎已经消失。