3

我试图弄清楚特定会话状态的大小。在我们的一个沉重页面(表中的大量数据)上,它变得越来越慢。该问题通过退出系统得到解决。

我已经分析了寻找 JavaScript 内存泄漏的页面,但我没有找到任何东西。我的下一个攻击计划是查看 ViewState 和 Session State。ViewState 将很简单,但 Session State 提出了挑战。

有谁知道任何有助于确定会话状态大小的技巧或工具?

编辑

会话状态是 InProc。

4

2 回答 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;
    }
}

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

于 2009-11-03T17:51:29.403 回答
1

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

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

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

  1. 会话状态为 InProc 时不会显示存储空间

    当 Session State 运行时,InProc (In Process) 构成内容的实际对象不存储在集合中,仅引用对象。在这些情况下,这些对象“处于”会话状态所占用的大小数字会产生误导。

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

也就是说,我发现它很有用,我认为它值得分享。将会话状态从进程中推出以分析大小可能是值得的。

于 2010-08-04T20:48:14.850 回答