ASP.Net会话状态的配置文件内存使用情况

3
我试图弄清楚特定会话状态的大小。在我们的某个重页面(表格中有很多数据)上,速度逐渐变慢。退出系统可以解决问题。
我已经剖析了该页面,寻找JavaScript内存泄漏,但是没有发现任何异常。我的下一个计划是查看ViewState和Session State。ViewState很简单,但Session State却很有挑战性。
是否有人知道任何技巧或工具,可以帮助确定Session State的大小?
编辑
会话状态为InProc。

你最后数了吗?它有多大了? - UpTheCreek
2个回答

6

测量它:

int totalBytes;
var formatter = new BinaryFormatter();
for(int i = 0; i < Session.Count; i++)
{
    using (var stream = new MemoryStream())
    {
        formatter.Serialize(stream, Session[i]);
        stream.Flush();
        totalBytes += stream.Length;
    }
}

此外,我相信如果你启用跟踪,它会显示有关会话的一些详细信息(不确定,从未尝试过)。

+1 看起来应该可以工作,但我肯定会继续寻找更好的方法... - Mark Brittingham
如果Session State中的所有内容都是可序列化的,那么这将起作用。 - Chuck Conway
哎呀,我以为你在使用 out of proc 会话。如果对象不可序列化,在 InProc 中是行不通的。 - Darin Dimitrov
这就是我遇到的问题... :( - Chuck Conway
你尝试启用跟踪了吗? - Darin Dimitrov

1

有些人提到了ASP.NET跟踪,但我自己没有太多的运气。我可以查看跟踪信息,但会话部分从未填充。

然而,这里有一篇有用的CodeProject文章,它使用http处理程序来查看当前会话(和缓存)。

关于这个问题有两个问题:

  1. 当会话状态为InProc时,它不会呈现存储空间

    当Session State运行InProc(进程内)时,形成内容的实际对象不存储在集合中,只有对对象的引用。在这种情况下,由这些对象“在”会话状态占用的大小数字将是误导性的。

  2. 它使用BinaryFormatter,它“仅给出会话数据大小的非常粗略的近似值”。因为ASP.NET“对于基本类型(如int、string、bool等),使用优化的内部格式化程序”。

话虽如此,我发现它很有用,值得分享。为了分析大小,将会话状态推出进程可能是值得的。


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