Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 估计/计算会话内存使用情况_C#_Asp.net_Session_Memory Management - Fatal编程技术网

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

C# 估计/计算会话内存使用情况,c#,asp.net,session,memory-management,C#,Asp.net,Session,Memory Management,我想估算ASP.NET web应用程序中服务器上每个会话使用的内存量。几个关键问题: 为每个会话实例分配了多少内存 每个变量的内存使用是否等于其给定的地址空间(例如,Int32的32位) 对于具有可变地址空间的变量(例如字符串、数组[]s),情况如何 自定义对象实例(例如,MyCustomObject,其中包含各种其他内容)如何 是否为每个变量添加了任何内容(例如,将其绑定到会话实例的Int32变量的地址)增加了每个变量的开销 如果能帮我弄清楚如何准确预测每个会话将消耗多少内存,我将不胜感激

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

  • 为每个会话实例分配了多少内存
  • 每个变量的内存使用是否等于其给定的地址空间(例如,Int32的32位)
  • 对于具有可变地址空间的变量(例如字符串、数组[]s),情况如何
  • 自定义对象实例(例如,MyCustomObject,其中包含各种其他内容)如何
  • 是否为每个变量添加了任何内容(例如,将其绑定到会话实例的Int32变量的地址)增加了每个变量的开销

如果能帮我弄清楚如何准确预测每个会话将消耗多少内存,我将不胜感激。谢谢大家!

您可以使用和获得其中的一些。我从来没有用ASP.NET测试过这些,但在其他方面,它们的性能非常好。

HttpSessionStateContainer类有十个本地变量,大约是40个字节,加上8个字节的对象开销。它有一个会话id字符串和一个items集合,所以当items集合为空时,它会多出50个字节。它还有一些引用,但我相信这些引用是对所有会话对象共享的对象的引用。总之,每个会话对象大约有100字节

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

如果在items集合中放置引用类型,则只存储引用,因此只有四个字节。如果它是一个文本字符串,那么它已经被创建了,所以不会使用更多的内存。创建的字符串将使用(8+8+2*长度)字节

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

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

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


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

这(不是ASP.NET)说明每个会话的开销约为10 KB。我不知道这是否也适用于ASP.NET,但它确实比Guffa提到的100字节高得多。

规划大规模应用程序,除了粗略的内存使用之外,还有一些其他的事情需要考虑。 这取决于您选择的会话状态提供程序,默认进程内会话可能根本就不是这样

对于进程外会话存储(这可能是可伸缩应用程序的首选),情况将完全不同,这取决于会话对象的序列化和存储方式

使用SQL会话存储,不会出现线性RAM消耗


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

.NET Memory Profiler是您的朋友:


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

您是否已经构建了应用程序,或者只是计划使用会话状态?为什么是会话状态?有更好的技术来考虑。比如,如果我需要跟踪状态?客户端?我会使用缓存,它更灵活。缓存是易变的,不受用户限制。将用户id添加到密钥还是其他方式有问题?