当前位置: 首页 > 知识库问答 >
问题:

C#List内存溢出异常,但远离2Gb限制

薄鸿远
2023-03-14

我有一个列表

当我开始向列表中添加项目时,当我越过100万行时,它会抛出内存不足异常。

我知道 .NET 每个对象有 2Gb 的限制,但除非我完全疯了:

1.000.000 * 64 字节 = ~61MB

这甚至还没有接近极限。

根据任务管理器的说法,当我开始填充列表时,我的应用程序使用了896mb,而当我到达异常时,它使用了1028mb。

计算机有8GB的物理内存,但它只使用6Gb。

有什么线索可以解释为什么会发生吗?

---更新----

将平台目标更改为x64解决了独立测试项目中的问题。遗憾的是,原始项目不能是x64的,因为引用了在x64上不工作的x86 DLLs。但那是另一个问题。

我没有想过把它改成x64,因为它似乎远离内存限制,但我想汉斯·帕萨特是对的,122mb离1.3Gb的限制太近了。谢谢大家。


共有1个答案

越开畅
2023-03-14

大型结构是在大型对象堆(LOH)上完成的,并且会受到碎片化的影响。

因此,虽然您可能有足够的可用内存,但您可能没有1个足够大的内存块。

你的数字(1Mx 64)本身是不够的,只有有足够的其他分配才能解释这个问题。你可以试着解决这个特殊的问题,但这可能只是一个更大的问题变得明显的时候。

通常,TaskManager不是诊断内存问题的正确工具。你需要一个内存分析器来找出发生了什么。

它还取决于您的平台版本以及它是 32 位还是 64 位。

 类似资料:
  • 内存溢出 内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。 内存泄漏通常情况下只能由获得程序源代码的程序员才能分析出来, 也是一个比较难以排查的问题。所有需要在开发前知道一些规范 内存溢出一直向一个 属性/变量 写数据 , 写入超过内存最大限

  • JNIEXPORT jint JNICALL Java_nc_mes_pub_hardware_PCI1761_readChanel(JNIEnv*,jobject,jint channel){ }

  • 我想格式化和写入一个大的(1.785.530条目)的内容到一个文本文件。大约85%的条目被处理后,它变得非常慢,然后我得到一个。 即使我: 在我的

  • 在Scrapy中,类似Requests, Response及Items的对象具有有限的生命周期: 他们被创建,使用,最后被销毁。 这些对象中,Request的生命周期应该是最长的,其会在调度队列(Scheduler queue)中一直等待,直到被处理。 更多内容请参考 架构概览 。 由于这些Scrapy对象拥有很长的生命,因此将这些对象存储在内存而没有正确释放的危险总是存在。 而这导致了所谓的”内

  • 本文向大家介绍请你说一说C++内存溢出和内存泄漏相关面试题,主要包含被问及请你说一说C++内存溢出和内存泄漏时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 1、内存溢出 指程序申请内存时,没有足够的内存供申请者使用。内存溢出就是你要的内存空间超过了系统实际分配给你的空间,此时系统相当于没法满足你的需求,就会报内存溢出的错误 内存溢出原因: 内存中加载的数据量过于庞大,如一次从数据库取出过多