.NET создание объектов и поколений - PullRequest
3 голосов
/ 19 апреля 2010

Есть ли способ указать .NET выделить новый объект в куче 2 поколения. У меня проблема в том, что мне нужно выделить примерно 200 МБ объектов, что-то с ними сделать и выбросить. Здесь происходит то, что все данные копируются два раза (с gen0 на gen1, а затем с gen1 на gen2).

Ответы [ 3 ]

2 голосов
/ 19 апреля 2010

Нет способа выделить непосредственно в поколении 2. Все распределения происходят в поколении 0 и для больших объектов в LOH.

Однако данные, как правило, не копируются при перемещении объектов в новое поколение. Вместо этого перемещаются начальные точки разных куч. Объекты могут быть перемещены из-за сжатия кучи, но это другая история.

Если важно хранить объекты в поколении 2, вы можете использовать экземпляры повторно. То есть создайте метод init для типов и вызывайте его вместо создания новых экземпляров.

0 голосов
/ 23 июля 2010

Если вы хотите исправить ваши объекты, чтобы каркас не мог их переместить, вы можете попробовать использовать 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();
0 голосов
/ 19 апреля 2010

Framework работает с большими объектами иначе, чем с обычными объектами. Итак, вкратце, это приводит к генерации больших объектов и не перемещает их при перераспределении кучи.

...