簡體   English   中英

驗證.NET中的瞬時內存分配差異?

[英]Verifying transient memory allocation differences in .NET?

我正在使用的應用程序會定期看到很大的JSON Blob,因此我正在嘗試更好地利用內存,並且在可能的情況下,請避免對反序列化時高於85Kb的對象執行某些LOH分配。

我有.NET Memory Profiler和dotMemory,但對如何使用它們有些不了解,所以我正在尋找一些建議。

我要配置的小型控制台應用程序只是在緊密的循環中執行以下方案,以查看正在進行的分配。

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

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),但是我應該尋找我的需求並不明顯。

運行下面在profiler下編寫的控制台應用程序,並在需要時獲取快照。 然后查看LOH中的所有對象。 重復第二種方法。

如果是dotMemory,請打開“所有對象”,然后打開“ 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);
}

暫無
暫無

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

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