我正在嘗試測量代碼的內存使用情況,但我不知道如何繼續。 我不想使用「DotMemory」或任何「探查器」,我需要通過編程來完成。如何測量代碼的內存使用情況?
有什麼辦法可以知道分配了多少對象? 像5 INT(4個字節)+ 4對象(16個字節)...
我用
process.WorkingSet64
,但我每次運行相同的代碼,我得到不同的值。
那麼,什麼是衡量一個代碼的內存使用情況的最好方法?
我正在嘗試測量代碼的內存使用情況,但我不知道如何繼續。 我不想使用「DotMemory」或任何「探查器」,我需要通過編程來完成。如何測量代碼的內存使用情況?
有什麼辦法可以知道分配了多少對象? 像5 INT(4個字節)+ 4對象(16個字節)...
我用
process.WorkingSet64
,但我每次運行相同的代碼,我得到不同的值。
那麼,什麼是衡量一個代碼的內存使用情況的最好方法?
.NET是一個託管內存環境。這意味着分配和取消分配對您來說是透明地處理的,但這也意味着內存使用模式不是完全確定性的。時間
99.9%,這是不是一個問題了。其餘時間,您應該將工作重點放在重要的領域 - 通常,在一個地方處理所有關鍵負載非常容易。
你的問題建議你來自一個C /帕斯卡爾背景 - 託管內存的代價是,你真的shoudln't照顧約記憶 - 當然,你要注意不要直接浪費內存,但服用兩次儘可能多的記憶通常不是失眠的原因。 「之前的記憶」和「記憶之後」是一個在多線程環境中確實沒什麼意義的問題 - 您的方法並不是唯一同時運行的方法。
簡單和愚蠢:
long total = GC.GetTotalMemory(true);
這不會顯示代碼的特定部分使用的內存。 –
@EmpereurAiman原始問題沒有這樣的要求。另外,我們可以調用這個方法,然後執行部分代碼,然後再次調用該方法。區別在於這部分代碼的內存消耗。 –
正如其他postsyou着的描述只是看你在這個過程中探險家看到的數字。
如果你真的想測量MemoryUsage,可以使用適當的工具,如RedGate Ants Profler或dotMemory。還有更多,但有了這兩個我做了很好的經驗。 他們也向你展示RAM how many instances of each type的和what do hold them alive
的主要問題是什麼是你在找這個原因嗎?你有沒有RAM問題?也許是泄漏? 在搜索問題時,常用的方法是使用上述工具製作快照並對其進行比較。在那裏你可以看到你有越來越多的實例。
要獲得對象的近似值,其大小(例如看到無論您可能會問題),你可以嘗試計算估計看到這個find size of object instanc in bytes in c sharp例如
如果您需要以編程方式測量內存消耗,你可以使用dotMemory Unit 當前版本可以通過ReSharper單元測試運行器與單元測試一起使用,但很快將提供帶有獨立運行器的下一個版本。
var mcp1 = dotMemory.Check();
methodX();
dotMemory.Check(memory =>
{
var newObjects = memory.GetDifference(mcp1).GetNewObjects();
var createdObjectsCount = newObjects.ObjectsCount;
var allocatedMemory = newObjects.SizeInBytes;
});
更多詳細信息在blog post。
UPDATE:獨立亞軍去EAP https://www.nuget.org/packages/JetBrains.DotMemoryUnit/2.0.20150727.161305-EAP5
There's一個很好的理由分析工具,如DotMemory成本的錢,收集保留內存的總量是很大的不僅僅是你的程序中計數的任何對象足跡更多。還有一些預留給.NET自己的內存,這是在工作集中考慮的。 – HimBromBeere
但爲什麼,如果我運行相同的代碼,即使我使用DotMemory或CLRprolfiler分配大小是不同的?的 – omega
可能重複的[如何編程測量.NET當前進程的總的內存消耗?](http://stackoverflow.com/questions/2342023/how-to-measure-the-total-memory-consumption-of當前進程編程) –