估计/计算会话内存使用情况

时间:2009-10-05 07:37:30

标签: c# asp.net session memory-management

我想估计我的ASP.NET Web应用程序中服务器上每个会话使用的内存量。一些关键问题:

  • 为每个Session实例分配多少内存?
  • 每个变量的内存使用量是否等于给定的地址空间(例如Int32的32位)?
  • 带有可变地址空间的变量怎么样(例如String,Array [] s)?
  • 自定义对象实例(例如包含各种其他内容的MyCustomObject)怎么样?
  • 是否为每个变量添加了任何内容(例如Int32变量的地址以将其绑定到会话实例)添加到每个变量的开销?

在了解如何准确预测每个会话将消耗多少内存时,会感谢一些帮助。谢谢!

5 个答案:

答案 0 :(得分:3)

HttpSessionStateContainer类有十个本地变量,因此大约40个字节,加上8个字节用于对象开销。它有一个会话ID字符串和一个items集合,因此当items集合为空时,它就像50多个字节。它有一些更多的引用,但我相信它们是对所有会话对象共享的对象的引用。总而言之,每个会话对象大约需要100个字节。

如果在会话的items集合中放置类似Int32的值类型,则必须将其装箱。对于8字节的对象开销,它达到12个字节,但由于内存管理器的限制,它不能为对象分配少于16个字节。使用四个字节来引用对象,Int32需要20个字节。

如果在items集合中放置引用类型,则只存储引用,因此只有四个字节。如果它是一个文字字符串,它已经创建,所以它不会再使用任何内存。创建的字符串将使用(8 + 8 + 2 * Length)字节。

将使用值类型数组(Length * sizeof(type))加上几个字节。引用类型数组将使用(Length * 4)加上几个字节作为引用,并且每个对象都是单独分配的。

自定义对象大致使用其成员大小的总和,在某些情况下加上一些额外的填充,加上8个字节的对象开销。包含Int32和布尔值(= 5个字节)的对象将被填充为8个字节,加上8个字节的开销。

因此,如果在会话对象中放入一个包含20个字符和三个整数的字符串,那么将使用约(100 +(8 + 8 + 20 * 2)+ 3 *(20))= 216个字节。 (但是,会话项集合可能会分配16个项目的容量,因此您使用16个字节的64个字节,因此大小将为264个字节。)

(所有大小都在32位系统上。在64位系统上,每个引用是8个字节而不是4个字节。)

答案 1 :(得分:1)

.NET Memory Profiler是你的朋友:

http://memprofiler.com/

您可以免费下载试用版并运行它。虽然这些东西有时候安装和运行起来很复杂,但我发现连接到正在运行的Web服务器并检查它在内存中保存的所有对象都非常简单。

答案 2 :(得分:0)

您可以使用Performance CountersCustom Performance Counters获取部分内容。我从来没有用ASP.NET测试过这些,但是否则测量性能非常好。

答案 3 :(得分:0)

这个old, old article from Microsoft containing performance tips for ASP(不是ASP.NET)声明每个会话的开销大约为10千字节。我不知道这是否也适用于ASP.NET,但它肯定比Guffa提到的那么多100字节开销。

答案 4 :(得分:0)

规划大规模应用程序除了粗略的内存使用之外,您还可能需要考虑其他一些事项。

这取决于您选择的会话状态提供程序,默认的进程内会话可能根本不是这样。

如果进程外会话存储(可能是可扩展应用程序的首选),图片将完全不同,并取决于会话对象的序列化和存储方式。

使用SQL会话存储时,不会有线性RAM消耗。

我建议从一开始就为大规模应用程序提供集成测试和会话状态提供程序的进程外风格。