2012-01-25 5 views
3

Мне недавно понадобилось использовать GC.AddMemoryPressure, и мне показалось странным, что он не принимает объект, чтобы добавить давление памяти в качестве аргумента. Я предполагаю, что поскольку он так тесно связан с временем выполнения, есть некоторый механизм, с помощью которого указатель this передается методу. Мой вопрос трижды:Как GC.AddMemoryPressure() знает, к какому объекту добавляется давление памяти?

  1. Как этот указатель передается методу?
  2. Я заметил, что при вызове его из статического метода исключение не возникает. Что происходит в этом случае?
  3. Почему другие методы GC, такие как GC.SupressFinalize и GC.ReRegisterForFinalize, принимают аргумент объекта, где этот метод не нужен?

ответ

1

Нет, это явно не связано с каким-либо конкретным объектом. Предполагается, что при удалении/завершении времени один и тот же объект удалит это давление. От the docs:

В простейшем шаблоне использования, управляемый объект выделяет неуправляемую память в конструкторе и освобождает его в Dispose или Доработка метод. Вызовите метод AddMemoryPressure после выделения неуправляемой памяти и вызовите метод RemoveMemoryPressure после его освобождения.

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

+0

Ah ok, я предполагал, что это давление памяти было связано с объектом, который выделяет неуправляемую память, то есть GC будет определять приоритеты объектов с большим давлением памяти для сбора. – Grokys

+0

«Вызвать метод AddMemoryPressure после выделения неуправляемой памяти». Разве не имеет смысла вызывать метод до выделения? В противном случае нативный/неуправляемый код может излишне исчерпывать память при распределении, поскольку сборщик мусора не знает о нативном/неуправляемом коде, требующем памяти. –

+0

@ChieltenBrinke: Я думаю, если вы его назовете * непосредственно перед * распределением, это не дало бы GC время собираться в любом случае. –

0

AddMemoryPressure запускает сборщик мусора в жизнь раньше, чем обычно. Это все. Suppress и RegisterForFinialise вызывают или не определяют конкретный код для этого типа при сборе экземпляра и его финализаторе ...

Предлагаем вам ознакомиться с помощником по сборщику мусора, вы можете обнаружить, что вам не нужно было call IncreaseMemoryPressure, или почти так же, как это может вызвать его, приведет к снижению производительности.

+0

Я выделяю большое количество неуправляемой памяти, которая отслеживается с помощью ConditionalWeakTable. Вы предполагаете, что мне не нужно называть AddMemoryPressure в этом случае? – Grokys

+0

Нет, это хорошо. Если вы правильно вызываете RemoveMemoryPressure. В основном это говорит GC, что больше памяти используется, чем она знает, поэтому ему нужно немного активнее использовать память. –

Смежные вопросы