Удаляет ли GC скомпилированные лямбды?
От: VladCore  
Дата: 19.06.18 15:08
Оценка:
Попался код который делает по многу MyFunc<T> myFunc = Expression.Lambda(typeof(Func...).Compile()

А я не знаю хорошо так делать или нехорошо я имею ввиду память оно в IL компилит или сразу в Native-Код.

И как его GC может чистить если это КОД...
Re: Удаляет ли GC скомпилированные лямбды?
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 19.06.18 15:26
Оценка: 6 (1) +3
Здравствуйте, VladCore, Вы писали:

VC>Попался код который делает по многу MyFunc<T> myFunc = Expression.Lambda(typeof(Func...).Compile()


VC>А я не знаю хорошо так делать или нехорошо я имею ввиду память оно в IL компилит или сразу в Native-Код.

Конечно в IL. Откуда .NET библиотека вообще знает про натив?

VC>И как его GC может чистить если это КОД...

При компиляции создается "динамическая сборка", которая выгружается полностью.
Подробнее тут https://msdn.microsoft.com/en-us/library/dd554932.aspx
Re: Удаляет ли GC скомпилированные лямбды?
От: nikov США http://www.linkedin.com/in/nikov
Дата: 20.06.18 03:29
Оценка: 19 (3) +1
Здравствуйте, VladCore, Вы писали:

VC>И как его GC может чистить если это КОД...


Это реализовано через DynamicMethod:

Defines and represents a dynamic method that can be compiled, executed, and discarded. Discarded methods are available for garbage collection.


Результат jit-компиляции DynamicMethod размещается в динамически выделяемой памяти, которая подлежит освобождению, когда этот код завершил исполнение, и не осталось ссылок на делегат. Это, конечно, отличается от обычной сборки мусора, и реализовано специальным образом.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.