我有一个应用程序,它将拥有我们拥有的类的数百万个对象。我们需要我们的应用程序在低内存机器上表现良好;所以我们有一个解决方案,可以让我们在磁盘上的文件系统中存储和检索对象。
我想要实现的是对象的某种“搁置”,一旦它被创建并且长时间不使用,
一种方法是破坏/重建;但我听说 GC 将长寿对象移至 Gen 2 Heap;有什么办法可以告诉 GC,对于某某类型的对象,第 2 代堆应该被其他东西替换吗?
我有一个应用程序,它将拥有我们拥有的类的数百万个对象。我们需要我们的应用程序在低内存机器上表现良好;所以我们有一个解决方案,可以让我们在磁盘上的文件系统中存储和检索对象。
我想要实现的是对象的某种“搁置”,一旦它被创建并且长时间不使用,
一种方法是破坏/重建;但我听说 GC 将长寿对象移至 Gen 2 Heap;有什么办法可以告诉 GC,对于某某类型的对象,第 2 代堆应该被其他东西替换吗?
我做了一些研究,从 .Net 4 开始,您可以使用ETW 来检测垃圾收集 ETW 事件:
Windows 事件跟踪 (ETW) 是一个跟踪系统,它补充了 .NET Framework 提供的分析和调试支持。从 .NET Framework 4 开始,垃圾收集 ETW 事件 捕获有用的信息,用于从统计角度分析托管堆。例如,GCStart_V1 事件(在即将发生垃圾回收时引发)提供以下信息:
首先,我建议您使用 CLR Profiler 快速查看托管堆。如果您正在处理数百万个对象,那么我怀疑将对象序列化到磁盘所花费的时间会太多开销。
最后一点建议是发布具有最低硬件要求的应用程序,这样您就不必担心这一点。