Класс HttpSessionStateContainer имеет десять локальных переменных, то есть примерно 40 байтов плюс 8 байтов для служебных данных объекта. Он имеет строку идентификатора сеанса и коллекцию элементов, так что это примерно 50 байтов, когда коллекция элементов пуста. У него есть еще несколько ссылок, но я считаю, что это ссылки на объекты, общие для всех объектов сеанса. Таким образом, в общей сложности это составит около 100 байт на объект сеанса.
Если вы поместите тип значения, например Int32, в коллекцию элементов сеанса, он должен быть упакован. При накладных расходах объекта в 8 байтов он достигает 12 байтов, но из-за ограничений в диспетчере памяти он не может выделить для объекта менее 16 байтов. С четырьмя байтами для ссылки на объект Int32 требуется 20 байтов.
Если вы поместите ссылочный тип в коллекцию элементов, вы сохраните только ссылку, то есть всего четыре байта. Если это буквальная строка, она уже создана, поэтому она не будет использовать больше памяти. Созданная строка будет использовать (8 + 8 + 2 * длина) байтов.
Массив типов значений будет использовать (Length * sizeof (type)) плюс еще несколько байтов. Массив ссылочных типов будет использовать (длина * 4) плюс еще несколько байтов для ссылок, и каждый объект выделяется отдельно.
Пользовательский объект использует примерно сумму размера его членов, плюс некоторые дополнительные отступы в некоторых случаях плюс 8 байтов служебных данных объекта. Объект, содержащий Int32 и логическое значение (= 5 байтов), будет дополнен до 8 байтов плюс 8-байтовая служебная информация.
Итак, если вы поместите строку с 20 символами и тремя целыми числами в объект сеанса, это будет использовать примерно (100 + (8 + 8 + 20 * 2) + 3 * (20)) = 216 байт. (Тем не менее, коллекция элементов сеанса, вероятно, выделит емкость из 16 элементов, так что это 64 байта, из которых вы используете 16, поэтому размер будет 264 байта.)
(Все размеры в 32-битной системе. В 64-битной системе каждая ссылка составляет 8 байтов вместо 4 байтов.)