我正在寻找一种方法让C#程序每隔一段时间将其自己的内存统计信息概述转储到控制台。
根据:
https://msdn.microsoft.com/en-us/library/ee851764%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396
WinDbg有一个名为vmstat
的命令和另一个名为!eeheap -gc
的命令,每个命令都打印出一个很好的统计数据块。
在我看来,这个功能不应该局限于手动操作,程序应该可以在没有WinDbg的情况下自动执行类似的操作。标准库或Nuget包中是否有任何内容可以执行此操作?
(并不是说我不要求提供成分,如何获得可以进行此类总结的个人数字。我知道GC,Process等等有许多这样的个人数字,不止一个人可以枚举或比较。我要求打包解决方案。)
答案 0 :(得分:0)
好的,似乎没有任何预先包装好的东西;以下是我提出的代码。
var process = Process.GetCurrentProcess();
Util.WriteHeading("cpu");
Util.WriteItem("user", process.UserProcessorTime);
Util.WriteItem("system", process.PrivilegedProcessorTime);
Util.WriteItem("total CPU", process.TotalProcessorTime);
Console.WriteLine();
Util.WriteHeading("memory");
Util.WriteItem("private", process.PrivateMemorySize64);
Util.WriteItem("total memory", GC.GetTotalMemory(false));
var sb = new StringBuilder();
for (int i = 0; i <= GC.MaxGeneration; i++)
{
if (i > 0)
sb.Append('/');
sb.Append(GC.CollectionCount(i));
}
Util.WriteItem("collection count", sb.ToString());
Console.WriteLine();
Console.WriteLine(" Current Peak");
Console.WriteLine("{0,16} {1,16:n0} {2,16:n0}",
"Paged",
process.PagedMemorySize64,
process.PeakPagedMemorySize64);
Console.WriteLine("{0,16} {1,16:n0} {2,16:n0}",
"Working Set",
process.WorkingSet64,
process.PeakWorkingSet64);
Console.WriteLine("{0,16} {1,16:n0} {2,16:n0}",
"Virtual Memory",
process.VirtualMemorySize64,
process.PeakVirtualMemorySize64);
Console.WriteLine();
Util.WriteHeading("stopwatch");
Console.WriteLine(stopwatch.Elapsed);
Console.WriteLine();