【发布时间】:2010-04-19 08:51:20
【问题描述】:
有没有办法告诉 .NET 在第 2 代堆中分配一个新对象。我有一个问题,我需要分配大约 200 MB 的对象,对它们做一些事情,然后把它们扔掉。这里发生的情况是所有数据都被复制了两次(从 gen0 到 gen1,然后从 gen1 到 gen2)。
【问题讨论】:
标签: .net garbage-collection instantiation
有没有办法告诉 .NET 在第 2 代堆中分配一个新对象。我有一个问题,我需要分配大约 200 MB 的对象,对它们做一些事情,然后把它们扔掉。这里发生的情况是所有数据都被复制了两次(从 gen0 到 gen1,然后从 gen1 到 gen2)。
【问题讨论】:
标签: .net garbage-collection instantiation
没有办法直接在第 2 代进行分配。所有分配都发生在第 0 代和 LOH 上的大对象。
但是,当对象移动到新一代时,通常不会复制数据。相反,不同堆的起点被移动。由于堆的压缩,对象可能会被移动,但这是另一回事。
如果在第 2 代中存储对象很重要,您可以重用这些实例。 IE。在类型上创建一些 init 方法并调用它而不是创建新实例。
【讨论】:
Framework 处理大对象的方式与处理普通对象的方式不同。简而言之,它将大对象放入生成中,并且在重新分配堆时不要移动它。
【讨论】:
如果您想修复对象以使框架无法移动它们,您可以尝试使用GCHandle 固定对象。这通常用于 P/Invoke,但会给出您正在寻找的结果。我怀疑您是否会看到由于代际压缩导致的减速,但我不能说没有看到您的分析数据。
http://msdn.microsoft.com/en-us/library/khk3k17t%28v=VS.71%29.aspx
例子:
var q = new MyObject();
var handle = GCHandle.Alloc(q, GCHandleType.Pinned);
// use object
handle.Free();
【讨论】: