Получение общей памяти, используемой хранилищем сеансов, работает только в том случае, если вы используете хранилище InProc
- если вы используете внешнее хранилище для состояния сеанса, такого как Redis или SQL-Server, тогда ответ равен нулю.
Ваш предложенный подход по крайней мере удвоит очевидное использование памяти в состоянии сеанса, потому что вы выполняете копию (сериализованных данных!) В MemoryStream
, который является родителем Byte[]
и тогда вы никогда не Dispose
это, оставляя боги GC решать, когда снизить нагрузку на память.Ваш подход также возвращает данные только для состояния сеанса текущего пользователя, а не для всех пользователей.
Проблема также усложняется, если учитывать такие вещи, как String Interning (где идентичные строковые значения во время выполнения .NET являются общиминесколькими строковыми ссылками) - поскольку эти строковые значения могут совместно использоваться различными состояниями сеанса разных пользователей.
Единственный способ точно определить, сколько используемой памяти используется, - использовать инструмент профилирования памяти, такой как JetBrains dotMemory или MemProfiler или инструменты анализа CLR / GC в WinDBG и в окне инструментов диагностики Visual Studio.