验证.NET中的瞬态内存分配差异?

时间:2016-01-23 08:59:46

标签: c# .net json memory profiling

我正在使用的应用程序看到定期传递给它的相当大的JSON blob所以我试图更好地利用内存,如果可能的话,避免在反序列化时为85Kb以上的对象做一些LOH分配

我有.NET Memory Profiler和dotMemory但是如何使用它们有点生疏,所以我正在寻找一些建议。

我要分析的小型控制台应用程序只是在紧密循环中执行以下方案,以查看正在进行的分配。

byte[] incomingMessage = ....; // LOH
string json = Encoding.UTF8.GetString(incomingMessage); // another LOH
return JsonSerializer.Deserialize(json);

VS

byte[] incomingMessage = ....; // LOH
using (MemoryStream ms = new MemoryStream(incomingMessage))
{
    using (StreamReader sr = new StreamReader(ms, Encoding.UTF8))
    {    
        return JsonSerializer.Deserialize(sr);
    }
}

我的理论是,第二个代码片段比第一个代码片段引起的LOH分配和碎片更少。

但是,我的问题是,如何验证?上述工具似乎做了很好的工作(特别是.NET Memory Profiler)来比较快照以发现泄漏等,但我不应该在寻找我的需求。

1 个答案:

答案 0 :(得分:0)

在profiler下运行下面编写的控制台应用程序,并在它要求时获取快照。然后看看LOH的所有物体。重复第二种方法。

如果是dotMemory,请打开"所有对象"而不是" Group by generations",而不是来自LOH的对象。

public void Main()
{
  byte[] incomingMessage = ....; // LOH
  string json = Encoding.UTF8.GetString(incomingMessage); // another LOH
  var desj = JsonSerializer.Deserialize(json);
  Console.Writeline("Get snapshot");
  Console.ReadLine();

  // prevent GC to collect them
  GC.KeepAlive(incomingMessage);
  GC.KeepAlive(json);
  GC.KeepAlive(desj);
}