GCHandle固定多少内存/对象会使垃圾收集器变慢

本文关键字:收集器 对象 多少 内存 GCHandle | 更新日期: 2023-09-27 18:17:48

我相信这个答案将取决于用户的机器,但是在固定数据方面一定有一些最佳实践。

我需要保存5个字节数组,每个数组包含1.048.576字节。通常我更喜欢使用GCHandle(托管)内存,但有些人说这会降低GC的速度。我知道这可能发生,但是需要固定多少内存/对象才能开始真正影响GC?

以下是我的选项:

  1. GCHandle.Alloc GCHandleType.Pinned(已管理)。它会减慢GC速度??
  2. Marshal.AllocHGlobal(非托管访问)。不安全代码
  3. 使用Bitmap在Scan0中保存数据(非托管访问)。不安全代码

GCHandle固定多少内存/对象会使垃圾收集器变慢

这是一个无法回答的问题。固定对象并不会大大降低GC的速度,它只是GC压缩堆时的一个障碍。很容易绕过岩石,只需跳过堆的固定部分。

更糟糕的结果是,在收集完成后,它将对运行的代码产生持久的影响。由于堆没有很好地压缩,引用的局部性就没有那么好,因此处理器将无法从CPU缓存中获得尽可能多的里程。对慢速进行量化是不可能的,它在很大程度上取决于之后运行的代码的类型。只是情况更糟,而且会持续一段时间,直到下一次GC。 唯一好的建议是,如果要固定,那么要尽可能短的时间。为了避免在固定对象时可能发生集合的情况。粗略地说,这意味着在保持引脚时避免分配内存。如果程序运行多个线程,这并不总是可行的,这使得.config文件中的<gcServer>元素具有吸引力。它选择一种不同的GC策略,该策略使用更多的内存,但为线程提供自己的GC堆段。没有简单的指导来确定何时执行此操作,需要使用实际数据集进行分析。

都元帅。AllocHGlobal和Bitmap对GC堆没有明显的影响,它们从非托管内存堆中分配。