程序化等同于vmstat或eeheap

时间:2016-11-21 09:42:36

标签: c# .net memory memory-management

我正在寻找一种方法让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等等有许多这样的个人数字,不止一个人可以枚举或比较。我要求打包解决方案。)

1 个答案:

答案 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();