Мне недавно понадобилось использовать GC.AddMemoryPressure, и мне показалось странным, что он не принимает объект, чтобы добавить давление памяти в качестве аргумента. Я предполагаю, что поскольку он так тесно связан с временем выполнения, есть некоторый механизм, с помощью которого указатель this
передается методу. Мой вопрос трижды:Как GC.AddMemoryPressure() знает, к какому объекту добавляется давление памяти?
- Как этот указатель передается методу?
- Я заметил, что при вызове его из статического метода исключение не возникает. Что происходит в этом случае?
- Почему другие методы GC, такие как GC.SupressFinalize и GC.ReRegisterForFinalize, принимают аргумент объекта, где этот метод не нужен?
Ah ok, я предполагал, что это давление памяти было связано с объектом, который выделяет неуправляемую память, то есть GC будет определять приоритеты объектов с большим давлением памяти для сбора. – Grokys
«Вызвать метод AddMemoryPressure после выделения неуправляемой памяти». Разве не имеет смысла вызывать метод до выделения? В противном случае нативный/неуправляемый код может излишне исчерпывать память при распределении, поскольку сборщик мусора не знает о нативном/неуправляемом коде, требующем памяти. –
@ChieltenBrinke: Я думаю, если вы его назовете * непосредственно перед * распределением, это не дало бы GC время собираться в любом случае. –