簡體   English   中英

.NET內存大小

[英].NET Memory size

關於存儲數據及其內存占用,我有一個非常基本的問題。

我有一個List<t>存儲我需要的基礎對象。 類型t有一個int id來定義它,以及其他字段。

我現在有一本詞典。 如果我創建一個Dictionary<t, int> ,其中t是值的對象,那么內存分配會高得多,如果我創建一個Dictionary<int, int> ,即存儲t對象的副本,或者是否只能再次存儲?

謝謝

這取決於T是什么。 如果T是引用類型(即class ),則只有引用將存儲在字典中。 如果T是值類型( struct ),則將存儲副本。

傳遞它們時,引用類型不會創建重復的對象。 在封面下,基本上你是在傳遞指針。 因此,如果您有N個對象,則每個對象將具有N x個內存+引用每個對象所需的內存。 這與這些引用的存儲容器無關,在您的情況下是字典。 您將為字典帶來一些內存成本,但如果您創建了另一個字典並將所有相同的對象放入其中,則內存中只有2x字典內存成本和一組對象。 這是您使用引用類型時。

MyObject object = new MyObject();  // one object created in memory
MyObject object2 = object; // still only one object created in memory, but we have two references now

值類型在內存中始終是唯一的。 因此,如果您創建System.Int32的字典,然后創建字典的副本,您也將擁有字典中每個值的副本。

int myInt = 5; // one int created in memory
int myInt2 = myInt; // two ints have been created in memory

因此,讓我們弄清楚為某些場景分配了哪些內存塊:

// two value types
Dictionary<int, int> myDictionary1 =  
1 x Dictionary
N x int <key>
N x int <value>

Dictionary<int, int> myDictionary1 + 
Dictionary<int,int> myDictionary2 (clone of 1) =
2 x Dictionary
2N x int <key>
2N x int <value>

// reference types
Dictionary <string, MyObject> myDictionary3 = 
1 x Dictionary
N x string Reference
N x string instance (if they are all unique)
N x Object Reference
N x Object instance (if they are all unique)

Dictionary <string, MyObject> myDictionary3 +
Dictionary <string, MyObject> MyDictionary4 (clone of 3) =
2 x Dictionary
2N x string reference
1N x string instance (if they are all unique)
2N x Object reference
1N x Object instance (if they are all unqiue)

你的情景:

Dictionary<int, MyObject> myDictionary5
1 X Dictionary
N X key
N X value reference
N X value object

Dictionary<int, MyObject> myDictionary5 + 
Dictionary<int, MyObject> myDictionary6 (clone of 5) =
2 x Dictionary
2N x key
2N x value reference
1N x value objects

只存儲對象的引用。 內存分配很小。

我假設你在談論特定的集合類型System.Collections.Generic.Dictionary<K,V>

您沒有告訴我們您的類型't'是值類型還是引用類型。

如果它是引用類型,例如class T { int id; ...} class T { int id; ...} ,然后Dictionary<K,T>將保留對您添加的對象的引用。

如果它是值類型,例如struct T { int id; ...} struct T { int id; ...} ,然后Dictionary<K,T>將保留您添加的值的副本。

快樂的黑客。

正如我在其他問題中提到的在開發時分析內存,你可以使用這段代碼:

bool forceFullCollection = false;

Int64 valTotalMemoryBefore = System.GC.GetTotalMemory(forceFullCollection);

//call here your bulk of Dictionary operations and objects allocations

Int64 valTotalMemoryAfter = System.GC.GetTotalMemory(forceFullCollection);

Int64 valDifferenceMemorySize = valTotalMemoryAfter - valTotalMemoryBefore;

關於參數forceFullCollection :“如果forceFullCollection參數為true,則此方法在系統收集垃圾並完成對象時返回之前等待一小段時間。間隔的持續時間是內部指定的限制,由完成的垃圾收集周期數和更改周期之間恢復的內存量。垃圾收集器不保證收集所有無法訪問的內存。“ GC.GetTotalMemory方法

祝好運!;)

暫無
暫無

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

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