[英].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.