在大型对象堆内存中预先分配一些内存

本文关键字:内存 分配 大型 对象 | 更新日期: 2023-09-27 17:58:59

我正在开发一个C#应用程序,而这个应用程序正面临内存紧缩,因为许多对象都在大型对象堆中获得内存分配。

我的C#应用程序必须处理许多大文件(作为字符串对象),因此这个字符串类型对象的内存一次又一次地从大型对象堆中分配(从而导致LOH碎片)。

由于字符串是一个不可变的对象,LOH中的一个新内存总是被分配给这个对象。我的问题是,有没有一种方法,我可以在大对象堆中预先分配一些内存,并始终为字符串对象分配相同的内存。

以下是更详细的内容:正如我提到的,我正在处理这些大文件。要进行处理,我必须将其转换为字符串。即使我使用stringBuilder,也不会有多大帮助,因为一旦我将其转换为String,就会在LOH中为其分配一个单独的内存。

所以,我希望在内存中分配一堆,比如说100 KB,每当我读取一个新文件并将其转换为字符串时,这100 KB就会被分配。

在大型对象堆内存中预先分配一些内存

您应该使用StringBuilder对象来处理字符串,因为它是一个可变的字符串,并提供了许多处理它的方法。

你是说每一个字符串都是一次又一次地被创建的。如果出于某种原因,您必须使用字符串,只需Intern它们-它们将存储一次,不会再次添加到内存堆中

您是否考虑过使用内存映射文件?http://msdn.microsoft.com/en-us/library/dd997372.aspx

我不知道你怎么处理字符串,但有理由不处理流吗?

目前还不清楚您想对字符串执行什么样的操作,您的最佳方法是对最终结果的估计。使用一个悲观的(大的)估计,也许可以加一个保证金。

然后使用容量参数创建StringBuilder:

var buffer = new StringBuilder(LargestExpectedSize);

这基本上是LOH上的预分配。避免StringBuilders或List<>的(自动)增长