【发布时间】:2011-09-13 01:13:00
【问题描述】:
我正在开发一个 C# 应用程序,该应用程序正面临内存紧缩,因为许多对象正在大对象堆中分配内存。
我的 C# 应用程序必须处理许多大文件(作为字符串对象),因此该字符串类型对象的内存会从大对象堆中一次又一次地分配(从而导致 LOH 碎片)。
由于字符串是不可变对象,因此 LOH 中的新内存总是分配给该对象。 我的问题是,有没有办法,我可以在大对象堆中预先分配一些内存,并始终为字符串对象分配相同的内存。
下面是更详细的事情: 正如我所提到的,我正在处理这些大文件。要进行处理,我必须将其转换为字符串。即使我使用 stringBuilder,它也不会有太大帮助,因为一旦我将它转换为 String,就会在 LOH 中为其分配一个单独的内存。
所以,我希望在内存中分配一堆,比如说 100 KB,每当我读取一个新文件并将其转换为字符串时,就会分配这 100 KB。
【问题讨论】:
-
考虑使用
StringBuilder,它基本上是一个可变字符串。 -
你为什么一遍又一遍地分配相同的字符串?如果您创建过一次,则只需将其传递给所有消费者。
-
为什么你认为 LOH 碎片是你的问题?
-
为什么你的代码会一次读取内存中的所有文件内容?您不能以较小的块读取文件吗?
-
不是同一个字符串,因为我在处理不同的文件,所以内容会不同。
标签: c# .net memory-management fragmentation large-object-heap