[英]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.