2013-08-17 109 views
1

我知道這篇文章會顯得重複,但我讀了所有這種文章和發展的樣本,以測試主題​​如何在內存中查找對象的大小?

Find size of object instance in bytes in c# http://www.codeproject.com/Questions/177604/Size-of-a-class-in-c How to get object size in memory? Getting the size of a field in bytes with C# http://blogs.msdn.com/b/cbrumme/archive/2003/04/15/51326.aspx

我有一個類白化任何屬性或領域,它只是測試它的大小而已。

[Serializable] 
public class MemberStateModel 
{ 


} 

我創建了一個對象,並通過波紋管代碼得到它的大小:

static void Main(string[] args) 
    { 
     MemberStateModel o = new MemberStateModel() {}; 
     long size; 

     using (Stream s = new MemoryStream()) 
     { 
      BinaryFormatter formatter = new BinaryFormatter(); 
      formatter.Serialize(s, o); 
      size = s.Length; 
     } 
    } 

現在的規模它顯示號碼159,由該帖子中,我認爲,這意味着我的O大小爲159kbyte但 我認爲它不正確的方式和一個空的物體不能有這樣的大小,這是真的嗎?

,因爲我的一些用戶的數據存儲在會話,如果這種規模的新增用戶在我的網站成長起來,我將需要更多的物理內存來處理我的web應用程序

+2

我不認爲你可以使用反射,序列化或任何其他基於代碼的方法找到對象的確切大小。我認爲你最簡單的選擇是使用Memory Profiler或使用[Windbg](http://www.windbg.org/)和sos.dll,轉儲堆並檢查對象大小。使用內存分析器或調試器的好處還在於,您可以在目標環境中檢查實際的生產代碼。 – PHeiberg

+0

@PHeiberg,我想你有權利,我現在要去測試它 – motevalizadeh

回答

1

BinaryFormatter告訴你需要多少字節才能將該類序列化爲二進制。這與課程在內存中所佔的大小非常不同。例如,BinaryFormatter將關於類型的信息寫入流中。

對象在內存中使用的大小沒有在編譯時定義,而是在運行時定義,因爲JIT編譯器決定了最終的佈局。現在出現瞭如何找出尺寸的問題。雖然我有一個解決方案的結構(創建一個數組,做指針算術),我不知道如何找到類的。一種解決方案是將類MemberStateModel定義爲結構,測量它,然後返回到類,假設它具有相同的大小。

您還可以通過計算字段的大小作爲下限(因爲發生填充)來估計大小。如果你的類有對其他類實例的引用,那麼估計幾乎是不可能的。

0

首先,這對我來說非常重要,它是不是159千字節,而是159個字節。甚至空對象佔用空間的原因是因爲BinaryFormatter也存儲了一些元數據。本文提供了一些解釋:http://www.codeproject.com/Articles/311944/BinaryFormatter-or-Manual-serializing

要估算解決方案的內存複雜度,可以使用內存分析器。例如,我使用了這個,甚至一個試用版也很有用:http://www.jetbrains.com/profiler/