簡體   English   中英

如何衡量代碼的內存使用情況?

[英]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 ProflerdotMemory 還有很多,但是有了這兩個,我有了很好的經驗。 它們還向您顯示ram 中每種類型多少個實例以及它們是如何存活的

所有實例列表

主要的問題是您尋找這個的原因是什么? 您有RAM問題嗎? 也許是泄漏? 搜索問題時,常用的方法是使用上述工具制作快照並進行比較。 在那里,您可以看到您的實例數量越來越多。

要獲得對象及其大小的近似值(例如,查看是否可能會遇到問題),您可以嘗試計算估算值,例如, 以c夏普單位,以字節單位查找對象的實例大小

暫無
暫無

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

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