ОК, все, что вы, эксперты ASP.NET: я использовал рефлектор для просмотра реализации ASP.NET Cache (который находится на HttpRuntime.Cache
и HttpContext.Current.Cache
) использует Hashtable
внутри, чтобы сохранить кеш.
Однако данные сохраняются в неуправляемой памяти. Это очень странно, потому что я не мог видеть, что данные хранятся в неуправляемой памяти. Однако, написав очень простое веб-приложение, которое вставляет кусок массива байтов в кеш, мы можем видеть это:
- Частные байты: 460 МБ
- Байт во всех кучах: 150 МБ
= >
Управляемая память: 150 МБ
Неуправляемая память: 310 МБ
Таким образом, в основном я вызываю приложение много раз (каждое увеличение - 1000х запросов, каждый из которых кладет пул буфера 64 Кбайт [] в кеш). Таким образом, тот, который вырос больше всего private bytes (общая память) вместо байтов во всех кучах (управляемая память). Однако я ожидаю, что управляемая память будет расти в соответствии с общей памятью, поскольку я добавляю объекты в управляемую кучу с помощью Hashtable.
Можете ли вы объяснить это поведение?
UPDATE
Как сказал Саймон, байты во всех значениях кучи меняются только после сбора мусора - я изменил код, чтобы вызвать сборку мусора, и обновил счетчики. Увеличение памяти Gen 2 Heap в точности совпадает с объемом добавленной памяти. Однако неуправляемая память все еще намного выше. В этом примере куча 2 составляла всего 96 МБ, а общая память - 231 МБ.