Чтение документации, похоже, что кеш не пытается вычислить размер объектов, которые он кэширует. Это имеет смысл, потому что это не то, что может быть сделано из самого процесса для произвольных типов (вы можете сделать это для структур фиксированного размера или массивов структур фиксированного размера, но это о нем); немного поискового запроса подтвердит это вам. Однако он знает, сколько оперативной памяти доступно на компьютере; вы можете получить это от new Microsoft.VisualBasic.Devices.ComputerInfo().AvailablePhysicalMemory
. Таким образом, предположительно кеш выполняет две вещи:
- Он отслеживает, когда последний раз использовался последний объект.
- Опросы для статистики памяти с некоторым интервалом.
Затем в каждом опросе объем доступной памяти находится в допустимых пределах, или нет. Если он находится в допустимых пределах, он ничего не делает. Если он не запускает удаление элементов, сначала будет удален последний элемент, который был последним.Он продолжает удалять элементы, пока память не вернется в допустимых пределах.
Если вы думаете об этом, это почти все, что вы можете сделать с информацией, доступной в кеше.
Эта стратегия в порядке, но она, очевидно, ломается, если у вас есть другие объекты, содержащие ссылки на элементы в кеше, поскольку удаление элемента из кеша не освободит его для сбора мусора. Это точка обратного вызова, чтобы выполнить очистку, чтобы гарантировать, что больше нет ссылок на объект.
Я уверен, что кэш пытается вычислить размер объектов в кеше. Было бы бесполезно это делать, поскольку (а) размер произвольного объекта может измениться после его вставки в кеш и (б) могут быть другие ссылки на объекты, на которые ссылаются поля кэшированного объекта, так что удаление из кеша не обязательно освобождает всю память. – Joe
Независимо от того, что он делает, он реализуется с помощью этого метода: http://referencesource.microsoft.com/#mscorlib/system/gc.cs,6da6dff768f373f5 – fernacolo
Изменен контент вопроса. –