如何衡量代码的内存使用情况?

时间:2015-07-10 11:35:44

标签: c# .net memory

我试图测量代码的内存使用情况,但我不知道如何继续。 我不想使用" DotMemory"或任何" profiler"我需要通过编程来实现。

有什么方法可以知道分配了多少对象? 像5 int(4 bytes)+ 4 Object(16 bytes)......

我用过

  

process.WorkingSet64

但每次我运行相同的代码时,我都会得到不同的值。

那么衡量代码内存使用情况的最佳方法是什么?

4 个答案:

答案 0 :(得分:2)

.NET是一种托管内存环境。这意味着您可以透明地处理分配和释放,但这也意味着内存使用模式并不完全是确定性的。

99.9%的时间,这根本不是问题。其余时间,您应该将工作重点放在重要的区域 - 通常,在一个地方处理所有关键负载非常容易。

你的问题暗示你来自C / Pascal背景 - 管理内存的权衡是你不应该真正关心内存 - 当然,你要注意不要直接浪费内存但是,如果需要两倍的内存,通常不会失去睡眠。 “之前的记忆”和“之后的记忆”是一个在多线程环境中确实没有多大意义的问题 - 你的方法并不是唯一一个同时运行的方法。

答案 1 :(得分:2)

如果您需要以编程方式测量内存消耗,可以使用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

中的更多详细信息

更新:独立跑步者进入EAP https://www.nuget.org/packages/JetBrains.DotMemoryUnit/2.0.20150727.161305-EAP5

答案 2 :(得分:0)

简单而愚蠢:

long total = GC.GetTotalMemory(true);

答案 3 :(得分:0)

正如其他帖子所描述的那样,只能看一下您在流程资源管理器中看到的数字。

如果您真的想测量MemoryUsage,建议您使用适当的工具,例如RedGate Ants ProflerdotMemory。还有很多,但有了这两个我已经取得了很好的经验。 他们还会向您显示how many instances of each type一个公羊和what do hold them alive

List of all instances

主要问题是你在看这个的原因是什么?你有RAM问题吗?也许泄漏? 在搜索问题时,常见的方法是使用上述工具制作快照并进行比较。在那里你可以看到越来越多的实例。

要获得对象及其大小的近似值(例如,为了看到您可能遇到问题),您可以尝试计算估算值,例如<{3}}