估算/计算会话内存使用量

4
我想要估算我的ASP.NET Web应用程序上每个会话所使用的内存量。以下是一些关键问题:
  • 为每个会话实例分配了多少内存?
  • 每个变量的内存使用情况是否等于其给定地址空间(例如Int32的32位)?
  • 对于具有可变地址空间(例如String、Array[]s)的变量如何处理?
  • 自定义对象实例的情况呢(例如MyCustomObject,其中包含各种其他内容)?
  • 每个变量是否添加了任何内容(例如Int32变量的地址,以将其与会话实例相关联),从而增加了每个变量的开销?
希望能够得到一些帮助,找出如何准确预测每个会话将使用多少内存。谢谢!

你已经构建了应用程序,还是只打算使用会话状态? 为什么要使用会话状态?有更好的技术可供考虑。 - Viktor Jevdokimov
比如说,如果我需要跟踪状态呢?客户端? - Alex
我会使用缓存,它更加灵活。 - Viktor Jevdokimov
缓存是易失性的,不属于用户。 - Alex
将用户ID添加到键中或以其他方式添加,这会有问题吗? - Viktor Jevdokimov
不是,但是不稳定性很糟糕。任何项目都可能随时消失。 - Alex
5个回答

3
HttpSessionStateContainer类有十个本地变量,大约为40个字节,再加上8个字节的对象开销。它有一个会话ID字符串和一个项集合,所以当项集合为空时,大约还有50个字节。它还有一些引用,但我认为那些是所有会话对象共享的对象的引用。因此,总体来说,每个会话对象大约需要100个字节。
如果将Int32等值类型放入会话的项集合中,则必须装箱。加上8个字节的对象开销,它就变成了12个字节,但由于内存管理器的限制,它不能分配少于16个字节的对象。加上对该对象的引用的四个字节,Int32需要20个字节。
如果将引用类型放入项集合中,则只需存储引用,因此只需四个字节。如果是文字字符串,则已经创建,因此不会使用更多的内存。创建的字符串将使用(8 + 8 + 2 * Length)个字节。
值类型数组将使用(Length * sizeof(type))加上几个字节。引用类型数组将使用(Length * 4)加上几个字节用于引用,每个对象单独分配。
自定义对象大约使用其成员大小的总和,加上某些情况下的额外填充,再加上8个字节的对象开销。包含Int32和Boolean(= 5个字节)的对象将填充到8个字节,再加上8个字节的开销。
因此,如果在会话对象中放置一个具有20个字符和三个整数的字符串,那么大约会使用(100 +(8 + 8 + 20 * 2)+ 3 *(20))= 216个字节。 (但是,会话项集合可能会分配16个项的容量,因此大小为264个字节,其中您使用了16个字节。)
(所有大小都在32位系统上。在64位系统上,每个引用是8个字节而不是4个字节。)

1

.NET Memory Profiler 是你的好朋友:

http://memprofiler.com/

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


0

在规划一个大型应用程序时,除了粗略的内存使用情况,您可能需要考虑其他一些事情。

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

对于外部进程会话存储(这可能是可扩展应用程序的首选),情况将完全不同,并且取决于会话对象如何序列化和存储。

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

我建议从一开始就使用外部进程会话状态提供程序进行集成测试,以适用于大型应用程序。


0

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接