簡體   English   中英

在 .NET 中找出對象使用多少內存的最簡單方法是什么?

[英]What is the easiest way to find out how much memory an object uses in .NET?

在 .NET 中找出對象使用多少內存的最簡單方法是什么?

最好不必求助於第三方工具。 Marshal.SizeOf 或 sizeof 運算符看起來很有用,但只適用於有限的類型范圍。

一些相關的帖子:

在這里提問和回答: 確定一個類使用多少內存?

快速總結是,如果您不想使用工具,則需要使用.NET Profiling API

Profiling API 非常強大,但我不認為它可以通過任何想象來“簡單”,因此我強烈建議使用內存分析工具 - 有一些免費的可以,有些則不- 太貴的商業產品(特別是JetBrains dotTrace )非常好。

由於 .NET 的垃圾收集特性,測量實際使用了多少內存有些困難。 例如,如果要測量類實例的大小,它是否包括您的實例指向的實例使用的內存?

如果答案是否定的,則將所有字段的大小相加:使用反射,遍歷類的所有成員; 將 Marshal.Sizeof(member.Type) 用於 typeof(ValueType).IsAssignableFrom(member.Type) 的任何內容 - 這測量原始類型和結構,所有這些都駐留在類的實例分配中。 每個引用類型(任何不能分配給值類型的東西)都將采用 IntPtr.Size。 對此有許多令人作嘔的例外情況,但它可能對您有用。

如果答案是肯定的,那么您的問題很嚴重。 多個事物可以引用單個實例,因此如果 'a' 和 'b' 都指向 'c',則RecursiveSizeOf(a) + RecursiveSizeOf(b)將大於SimpleSizeOf(a) + SimpleSizeOf(b) + SimpleSizeOf(c)

更糟糕的是,遞歸測量可能會導致循環引用,或者導致您不打算測量的對象 - 例如,如果一個類正在引用互斥鎖,則該互斥鎖可能指向擁有它的線程。 該線程可能指向它的所有局部變量,這些變量指向一些 C# 框架結構……您可能最終會測量整個程序。

理解像 C# 這樣的垃圾收集語言在區分對象和內存單元的方式上有些“模糊”(從完全非技術的意義上來說)可能會有所幫助。 這是Marshal緩解的很多問題 - 編組規則確保您正在編組(或測量)的結構具有明確定義的內存布局,因此具有明確定義的大小。 在這種情況下,如果您打算使用 Marhsal.SizeOf(),則應該使用定義良好、可編組的結構。

另一種選擇是序列化。 這不會具體告訴您正在使用多少內存,但它會讓您對對象的大小有一個相對的了解。 但同樣,為了序列化事物,它們必須具有明確定義的布局(因此具有明確定義的大小)——您可以通過使類適當地可序列化來實現。

如果上述任何選項吸引您,我可以發布實施示例。

你也可以做這樣的事情:

int startMem = GC.GetTotalMemory(true);
YourClass c = new YourClass();
int endMem = GC.GetTotalMemory(true);
int usedMeme = endMem - startMem;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM