125得票5回答
为什么要关注大对象堆(Large Object Heap,LOH)?

我已经了解了代和大对象堆,但我仍然无法理解拥有大对象堆的意义(或益处)是什么? 如果CLR只依靠第二代来存储大型对象(考虑到Gen0和Gen1的阈值过小),可能会出现什么问题(在性能或内存方面)?

26得票3回答
垃圾收集即使在需要时也没有发生

我做了一个64位的WPF测试应用程序。在我的应用程序运行并打开任务管理器时,我观察系统内存使用情况。我看到我正在使用2GB,并且有6GB可用。 在我的应用程序中,我点击一个添加按钮,将一个新的1GB字节数组添加到列表中。我看到我的系统内存使用量增加了1GB。我总共点击了6次添加按钮,填满了我...

21得票7回答
在32位的.NET进程中分配超过1,000 MB的内存

我想知道为什么我的32位.NET进程不能分配超过1000MB的内存。以下小应用程序在分配了1000MB后会抛出OutOfMemoryException异常。为什么是1000MB而不是1.8GB?是否有一种可以更改进程范围设置的方法?static void Main(string[] args)...

16得票3回答
使用字节数组时的堆碎片问题

我有一个使用C# 4.0编写的单生产者/单消费者应用程序,它以块为单位传输大量数据。尽管没有新的内存分配,但是经过一段时间后我会耗尽内存。 我使用Redgate Memory Profiler对内存进行了分析,发现有很多可用的空闲内存。但由于碎片化,无法使用这些空闲内存。 我使用阻塞集合作...

16得票4回答
内存流和大对象堆

我需要使用WCF在不可靠的连接之间传输大文件。为了能够恢复文件并且不希望WCF限制我的文件大小,我将文件分成1MB的块,并且这些“块”被作为流进行传输。目前看来效果不错。 我的步骤如下: 1. 打开文件流 2. 从文件中读取块到byte[]并创建MemoryStream 3. 传输块 4....

16得票6回答
大型数组和LOH碎片化。什么是公认的惯例?

我有一个活跃的问题是关于一些无望的内存问题,可能涉及LOH碎片以及其他未知因素。请点击此处查看。 我的问题是,什么是被接受的做法呢? 如果我的应用程序需要使用Visual C#完成,并且需要处理int [4000000]这样规模的大数组,如何避免垃圾回收器拒绝处理LOH的情况发生? 似乎我...

12得票1回答
在C#中避免大量、快速和频繁的内存分配时出现OutOfMemoryException异常

我们的应用程序需要不断分配大量数据的数组(例如数十到数百兆字节),这些数组在被丢弃前只存在短暂的时间。如果处理方式不当,可能会导致大对象堆碎片化,最终导致应用程序崩溃并出现OutOfMemoryException异常,尽管当前活动对象的大小并不过多。 我们之前已经成功采用了一种方法来解决这个...

12得票3回答
正则表达式、字符串生成器和大对象堆碎片化问题

如何在大字符串中运行多个正则表达式(以查找匹配项)而不会导致LOH碎片化? 使用.NET Framework 4.0,因此我正在使用StringBuilder,因此它不在LOH中,但是一旦我需要对其运行RegEx,我就必须调用StringBuilder.ToString(),这意味着它将位于...

11得票4回答
大对象堆和来自队列的字符串对象

我有一个 Windows 控制台应用程序,它应该在数天或数月内无需重新启动即可运行。该应用程序从 MSMQ 中检索“工作”并对其进行处理。有 30 个线程同时处理工作块。 来自 MSMQ 的每个工作块大约为 200KB,其中大部分分配在单个字符串对象中。 我注意到,在处理约 3-4 千个这...

10得票4回答
只在第二代和大对象堆上执行GC.Collect

我的应用程序有一个特定的时间点,当许多大对象同时被释放时。那个时候,我想专门在大对象堆(LOH)上进行垃圾回收。 我知道你无法这样做,必须调用GC.Collect(2),因为仅当它执行第二代垃圾回收时,GC才会对LOH进行回收。然而,根据文档中的说明,调用GC.Collect(2)仍会在第一...