2009-11-03 20 views
3

我想弄清楚特定會話狀態的大小。在我們的一個沉重頁面(表格中的大量數據)中,它逐漸變慢。該問題通過註銷系統來解決。配置文件內存使用會話狀態ASP.Net

我描述了尋找JavaScript內存泄漏的頁面,但是我沒有找到任何東西。我的下一個攻擊計劃是查看ViewState和Session State。 ViewState會很簡單,但Session State會帶來挑戰。

有誰知道有哪些技巧或工具可以幫助確定會話狀態的大小嗎?

編輯

會話狀態InProc方式。

+0

你到底有數嗎?它有多大? – UpTheCreek 2011-01-05 18:56:27

回答

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; 
    } 
} 

而且我相信,如果你enable tracing它會告訴你關於會話的一些細節(不知道這一點,從來沒有嘗試過我自己)。

+0

+1,因爲它看起來應該可以工作,但我一定會繼續尋找更好的方法...... – 2009-11-03 17:55:57

+0

如果會話狀態中的所有內容都是可串行化的,那麼這將起作用。 – 2009-11-03 17:59:40

+0

糟糕,我以爲你使用了proc會話。使用InProc時,如果對象不可序列化,它將不起作用。 – 2009-11-03 18:05:23

1

有些人提到ASP.NET跟蹤,但我自己並沒有太多運氣。我可以查看跟蹤信息,但會話部分從未填充過。

但是,這裏有一個有用的article from CodeProject,它使用http處理程序來查看當前會話(和緩存)。

有關於這個問題的兩個問題:

  1. 其會在會話狀態InProc方式

    不存在存儲空間

    當會話狀態運行InProc方式 (正在處理) 構成內容的實際對象不會存儲在 集合中,只會參考 對象。在這些對象「in」會話 狀態中佔用的大小爲 的數字在這些 的情況下會引起誤解。

  2. 它使用BinaryFormatter其「僅給出會話數據的大小的非常粗略的近似」。這只是一個近似值爲ASP.NET「使用經過優化的內部格式爲基本類型,如int,字符串,bool等,」

這就是說,我發現它有用,我認爲這是值得分享。可能需要將會話狀態推出處理以分析大小。