.NET對象占記憶體多少

來源:互聯網
上載者:User

一直有一個小小的疑惑——.NET一個對象或者一個集合佔多少記憶體?有沒有很快速的方法擷取,而不是簡單的估計分析對象大小?

查了MSDN,和一些其他人的分析,得到解決是Managed 程式碼對象的大小無法真實的得到,因為存在託管對象轉化成非託管的CLR最佳化。但我仍然不死心,非要弄個究竟!好吧,最終得到一些結果了。

 sizeof關鍵字,用於擷取實值型別的大小,如int(佔4個位元組),char(2個位元組);並且sizeof 運算子僅適用於實值型別,而不適用於參考型別。所以針對對象改關鍵字無法使用。

查閱msdn,發現對象Marshal.SizeOf 方法,解釋為返回類的非託管大小;但是仍然不能使用,因為針對的是Unmanaged 程式碼,如果直接使用一個類的對象,會報一個錯誤:"不能作為非託管結構進行封送處理;無法計算有意義的大小或位移量。";這是因為對象在記憶體中實際大小並不是固定的,可能這次運行一個值,下次就是另外一個值了,存在最佳化!

所以為了固定一個對象的大小,必須告訴CLR不最佳化對象在記憶體中的大小。這就需要在聲明類的時候加上[StructLayout(LayoutKind.Sequential)]這個特性;

StructLayoutAttribute 類使使用者可以控制類或結構的資料欄位的物理布局。

LayoutKind 枚舉  控制當匯出到Unmanaged 程式碼時對象的布局。

成員名稱 說明
Sequential 對象的成員按照它們在被匯出到非託管記憶體時出現的順序依次布局。這些成員根據在 StructLayoutAttribute..::.Pack 中指定的封裝進行布局,並且可以是不連續的。
Explicit 對象的各個成員在非託管記憶體中的精確位置被顯式控制。每個成員必須使用 FieldOffsetAttribute 指示該欄位在類型中的位置。
Auto 運行庫自動為非託管記憶體中的對象的成員選擇適當的布局。使用此枚舉成員定義的對象不能在Managed 程式碼的外部公開。嘗試這樣做將引發異常。

這就是控制對象轉化為Unmanaged 程式碼時佔用記憶體固定,這樣我們就可以舒服的使用Marshal.SizeOf方法了。得到一個對象的大小。如果一個對象中還包含另外一個對象,那麼另外一個對象可以使用這個[StructLayout(LayoutKind.Sequential)]也可以不使用,如果使用則是,該對象的大小加上這個對象的大小;如果不使用則是該對象的大小加上4個位元組(就是這個對象引用大小)。

當想擷取一個集合的大小時候,我們不能在List上加這個屬性,因為微軟的dll中的類,那麼我們怎麼樣才能擷取對應的大小呢?其實還用一種簡單的方式,就是將對象或者集合轉化成記憶體流,再擷取記憶體流的大小就ok了,雖然有一些其他影響大小,但基本上可以正確的粗數量級估計一個對象在記憶體的大小或者比較倆個對象、集合的大小的!

主要代碼:

BinaryFormatter binaryFormatter = new BinaryFormatter();MemoryStream stream = new MemoryStream();binaryFormatter.Serialize(stream, personList);stream.Seek(0, SeekOrigin.Begin);

其實裡面東西多著的,我僅僅瞭解了一點點,分享一下,大家一起討論一下,如果有錯誤,請批評指出!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.