[英]How to measure memory usage of a code?
我正在嘗試測量代碼的內存使用情況,但是我不知道如何進行。 我不想使用“ DotMemory”或任何我需要通過編程來完成的“探查器”。
有什么方法可以知道分配了多少個對象? 像5個int(4個字節)+ 4個對象(16個字節)...
我用了
process.WorkingSet64
但是每次我運行相同的代碼時,我都會得到不同的值。
那么衡量代碼內存使用率的最佳方法是什么?
.NET是托管內存環境。 這意味着分配和釋放將為您透明地處理,但是這也意味着內存使用模式不是完全確定的。
99.9%的時間,這根本不是問題。 在其余時間中,您應該將工作重點放在重要的領域上-通常,將所有關鍵負載集中在一個地方很容易。
您的問題建議您來自C / Pascal背景-托管內存的權衡是您不應該真正在乎內存-當然,您要注意不要完全浪費內存,而要占用嚴格必要內存的兩倍通常不是失去睡眠的事情。 在多線程環境中,“之前的內存”和“之后的內存”確實是沒有多大意義的一個問題-您的方法並不是同時運行的唯一方法。
如果您需要以編程方式測量內存消耗,則可以使用dotMemory單元。當前版本可以通過ReSharper單元測試運行器與單元測試一起使用,但是很快將推出具有獨立運行器的下一個版本。
var mcp1 = dotMemory.Check();
methodX();
dotMemory.Check(memory =>
{
var newObjects = memory.GetDifference(mcp1).GetNewObjects();
var createdObjectsCount = newObjects.ObjectsCount;
var allocatedMemory = newObjects.SizeInBytes;
});
有關更多詳細信息,請參見博客文章 。
更新:獨立運行器使用EAP https://www.nuget.org/packages/JetBrains.DotMemoryUnit/2.0.20150727.161305-EAP5
簡單而愚蠢:
long total = GC.GetTotalMemory(true);
如其他文章所述,您不能只看一下在流程瀏覽器中看到的數字。
如果您真的想測量MemoryUsage,建議使用適當的工具,例如RedGate Ants Profler或dotMemory 。 還有很多,但是有了這兩個,我有了很好的經驗。 它們還向您顯示ram 中每種類型有多少個實例以及它們是如何存活的
主要的問題是您尋找這個的原因是什么? 您有RAM問題嗎? 也許是泄漏? 搜索問題時,常用的方法是使用上述工具制作快照並進行比較。 在那里,您可以看到您的實例數量越來越多。
要獲得對象及其大小的近似值(例如,查看是否可能會遇到問題),您可以嘗試計算估算值,例如, 以c夏普為單位,以字節為單位查找此對象的實例大小
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.