当前位置: 首页 > news >正文

.NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?

都知道可以在任务管理器中查看进程的 CPU 和内存占用,那么如何通过 .NET 编写代码的方式来获取到 CPU 和内存占用呢?

.NET 中提供了 PerformanceCounter 类型,可以用来监视系统中大量的性能问题。


本文内容

    • 获取全局 CPU 和内存占用
    • 获取当前进程的 CPU 和内存占用

获取全局 CPU 和内存占用

要获取到全系统中的 CPU 占用率,获取全系统中内存占用,需要首先分别创建这两者的性能计数器:

// 创建对 CPU 占用百分比的性能计数器。
var cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
// 创建内存占用字节数的性能计数器
var ramCounter = new PerformanceCounter("Memory", "Available MBytes");

接下来,使用 NextValue() 可分别获取到两者的值:

float cpu = CpuCounter.NextValue();
float ram = RamCounter.NextValue();

你需要注意的是,我们在创建 PerformanceCounter 时,构造函数中传入的参数是固定的,或者说必须跟当前系统中安装的计数器的计数器类别的名称(categoryName,第一个参数)和计数器的名称(counterName,第二个参数)对应。另外,如果某个类别包含单个实例,那么需要传入实例名称(instanceName,第三个参数)。

获取当前进程的 CPU 和内存占用

在了解的 PerformanceCounter 各个参数代表的含义之后,我们还可以获取到单个进程的性能计数。

var name = Process.GetCurrentProcess().ProcessName;
var cpuCounter = new PerformanceCounter("Process", "% Processor Time", name);
var ramCounter = new PerformanceCounter("Process", "Working Set", name);

也是使用 NextValue() 来获取到此性能计数器实例的值。

这里,我们在计算单个进程的内存占用时,使用的是工作集大小,这个值会比较接近我们平时使用任务管理器看到的物理内存占用的大小,但是我们还有其他可以查询的类别:

  • Private Bytes
    包含进程向系统中申请的私有内存大小,不包含跨进程中共享的部分内存。
  • Working Set
    进程占用的物理内存的大小。由于包含共享内存部分和其他资源,所以其实并不准;但这个值就是在任务管理器中看到的值。
  • Virtual Bytes
    进程在地址空间中已经使用到的所有的地址空间总大小。

参考资料

  • PerformanceCounter Class (System.Diagnostics) - Microsoft Docs
  • How to get the CPU Usage in C#? - Stack Overflow
  • .net - Get CPU Usage for Process by Process ID - Stack Overflow
  • c# - What is the correct Performance Counter to get CPU and Memory Usage of a Process? - Stack Overflow
  • debugging - What is private bytes, virtual bytes, working set? - Stack Overflow

我的博客会首发于 https://blog.walterlv.com/,而 CSDN 会从其中精选发布,但是一旦发布了就很少更新。

如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

知识共享许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://walterlv.blog.csdn.net/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

相关文章:

  • 如何监视 WPF 中的所有窗口,在所有窗口中订阅事件或者附加 UI
  • 如何追踪 WPF 程序中当前获得键盘焦点的元素并显示出来
  • 使用 Visual Studio 编译时,让错误一开始发生时就停止编译(以便及早排查编译错误节省时间)
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • 在项目文件 / MSBuild / NuGet 包中编写扩展编译的时候,正确使用 props 文件和 targets 文件
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • 如何给 Windows Terminal 增加一个新的终端(以 Bash 为例)
  • 在 Visual Studio 中设置当发生某个特定异常或所有异常时中断
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • 如何在 Windows 10 中安装 WSL2 的 Linux 子系统
  • 如何安装和准备 Visual Studio 扩展/插件开发环境
  • 基于 Roslyn 同时为 Visual Studio 插件和 NuGet 包开发 .NET/C# 源代码分析器 Analyzer 和修改器 CodeFixProvider
  • 软件界面中一些易混淆/易用错的界面文案,以及一些约定俗成的文案约定
  • WPF 的 VisualBrush 只刷新显示的视觉效果,不刷新布局范围
  • Google 是如何开发 Web 框架的
  • [译]CSS 居中(Center)方法大合集
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • Git的一些常用操作
  • Go 语言编译器的 //go: 详解
  • JavaScript-Array类型
  • Leetcode 27 Remove Element
  • Linux各目录及每个目录的详细介绍
  • MobX
  • sublime配置文件
  • vue 配置sass、scss全局变量
  • Vue小说阅读器(仿追书神器)
  • webpack+react项目初体验——记录我的webpack环境配置
  • 半理解系列--Promise的进化史
  • 来,膜拜下android roadmap,强大的执行力
  • 设计模式走一遍---观察者模式
  • 手写一个CommonJS打包工具(一)
  • 微信开放平台全网发布【失败】的几点排查方法
  • 一道闭包题引发的思考
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • 进程与线程(三)——进程/线程间通信
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (分类)KNN算法- 参数调优
  • (九)信息融合方式简介
  • (篇九)MySQL常用内置函数
  • (七)c52学习之旅-中断
  • (三)uboot源码分析
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (转)http-server应用
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .NET Core 和 .NET Framework 中的 MEF2
  • .net core使用ef 6
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .net6+aspose.words导出word并转pdf
  • .NET精简框架的“无法找到资源程序集”异常释疑