2

我有一种感觉,我在我的 ASP.NET 会话中放入了相当多的数据,但我不知道有多少以及是否应该担心。我发现了一个类似的问题,但这依赖于序列化对象并检查它们的序列化大小。在我的情况下,会话中的大部分数据都在来自另一个库的对象中,该库没有将其类标记为“Serializable”。(我知道这限制了我使用 InProc 会话状态提供程序,但这是另一个问题)。有没有人知道如何遍历对象图并找出它的大小?

补充:好的,一种方法是手动遍历对象图和使用 Marshal.SizeOf() 方法。但要让它发挥作用,需要大量的写作。是否有更简单的方法可以达到相同的效果?我的目标不是字节精度,我对数量级感兴趣(千字节、兆字节、数十兆字节......)

4

3 回答 3

1

你不能生成一个堆转储并从中找到会话的大小。在 java 中,我可以转储堆,然后在mat中打开它,找到会话对象并找出子图的大小。

于 2009-04-15T14:50:10.760 回答
1

对于测试,您可以组合一个存根自定义会话提供程序,实现 SessionStateStoreProviderBase 抽象类。我会编写将所有内容存储在 WebCache 中的支持字段(以便管理会话数据),并最终在调用 SetAndReleaseItemExclusive 方法时使用 Marshal.SizeOf() 方法生成统计信息。

        public override void SetAndReleaseItemExclusive(HttpContext context, string id, SessionStateStoreData item, object lockId, bool newItem)
        {

        double MemSize = 0;
        foreach (object sessObj in item.Items)
        {
            MemSize += Marshal.SizeOf(sessObj);
        }

}

有关获取字段大小的更多信息,请参阅此问题: Getting the size of a field in bytes with C#

于 2009-04-15T14:04:15.333 回答
-1

您可能可以将会话状态信息存储在数据库中并检查大小,但我不确定是否有任何工具可以让您查看和遍历对象图。

如果可能,再检查一次您的设计,看看您是否可以最大限度地减少会话中的信息。

于 2009-04-15T13:51:25.567 回答