作者:殉情放开那只小兔子 | 2023-08-31 17:40
我有一个应用程序,在运行时,需要轮询自己的内存使用情况.如果它可以列出实例化的每个对象的内存使用情况,那将是理想的.我知道这可以通过WMI实现,但我希望有一些不依赖于WMI的东西.
1> Jim Mischel..:
您可能会发现两个有用的功能:
GC.GetTotalMemory();
Process.PagedMemorySize64();
我的经验是GC.GetTotalMemory()并不十分可靠.它通常报告的内存使用量远远小于实际内存使用量.我已经看到它报告说当我的程序在16 GB的机器上耗尽时,我只使用8 GB.
我还没有测试过Process.PagedMemorySize64,虽然看起来很有前景.
我不确定`Process.PagedMemorySize64`何时有用,但它在我的情况下并没有真正起作用.我在实例化一堆对象并运行解析器之前/之后执行比较,而PagedMemorySize64在之前和之后报告相同的值,而`GC.GetTotalMemory(true)`似乎更有效地报告内存使用的变化.
@SteveWortham缓存各种进程属性(例如,PagedMemorySize64),因此只需再次访问它们就不会为您提供新值.Process.Refresh()旨在吹走缓存并获取新数字,但我发现它不起作用.但是,实际上每次创建一个新的Process对象(System.Diagnostics.Process.GetCurrentProcess())都可以.不理想,但确实有效.
2> 小智..:
Process proc = Process.GetCurrentProcess();
Logger.Info(proc.PeakWorkingSet64/1024 + "kb");