c# - 如何释放或回收 C# 中的字符串?

标签 c# string garbage-collection immutability

我有一个大字符串(例如 20MB)。

我现在正在解析这个字符串。问题是 C# 中的字符串是不可变的;这意味着一旦我创建了一个子字符串并查看它,内存就被浪费了。

由于所有的处理,内存被我不再使用、不需要或引用的 String 对象堵塞;但是垃圾收集器释放它们的时间太长了。

所以应用程序内存不足。

我可以使用性能不佳的 club 方法,并调用几千次:

GC.Collect();

无处不在,但这并不能真正解决问题。

我知道 StringBuilder创建 大字符串时存在。

我知道 TextReader 的存在是为了将 String 读入 char 数组。

我需要以某种方式“重用”一个字符串,使其不再是不可变的,这样我就不会在 1k 的情况下不必要地分配千兆字节的内存。

最佳答案

如果您的应用程序快死了,那可能是因为您仍然有对字符串的引用——而不是因为垃圾收集器只是未能清理它们。我已经看到它像那样失败了,但这不太可能。您是否使用分析器来检查您是否确实确实一次在内存中有很多字符串?

总而言之,您不能重复使用一个字符串来存储不同的数据——这是不可能的。如果愿意,您可以编写自己的等价物——但有效且正确地做到这一点的机会非常渺茫。现在,如果您可以提供有关您正在做的事情的更多信息,我们可能会建议不使用太多内存的替代方法。

关于c# - 如何释放或回收 C# 中的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7324918/

相关文章:

c# - 将数据集传递给存储过程

c# - 使用 C# 检测事件窗口更改而不轮询

c# - 如何处理 MVVM 中并行任务的 ObservableCollection<> 结果?

java - 用于基于 Java 模板的字符串构造的工具

c# - 采用 IDisposable 模式

c# - MvxListView 不像普通的 xamarin ListView 那样流畅

python原始字符串赋值

string - 是否有 SOUNDEX 或变音位的替代方法来处理冲突较少的名称?

java - 在java函数内部或外部操作数据,会对性能产生影响吗?

.net - 从 .NET 中的构造函数中抛出异常