我正在使用的应用程序看到定期传递给它的相当大的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)来比较快照以发现泄漏等,但我不应该在寻找我的需求。
答案 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);
}