有没有办法告诉.NET在第2代堆中分配新对象。我有一个问题,我需要分配大约200 MB的对象,用它们做一些事情,然后扔掉它们。这里发生的是所有数据被复制两次(从gen0到gen1,然后从gen1复制到gen2)。
答案 0 :(得分:2)
无法直接在第2代中进行分配。所有分配都在第0代和LOH上的大对象中进行。
但是,当对象移动到新一代时,通常不会复制数据。而是移动不同堆的起点。由于堆的压缩,对象可能会移动,但这是一个不同的故事。
如果在第2代中存储对象很重要,则可以重用实例。即对类型进行一些init方法并调用它而不是创建新实例。
答案 1 :(得分:0)
框架与使用普通对象的大对象的工作方式不同。所以简单地说,它将大对象放在生成中,并且在重新分配堆时不要移动它。
答案 2 :(得分:0)
如果要修复对象以使框架无法移动它们,可以尝试使用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();