首页 新闻 会员 周边

C#通过Process类能够获取进程内存大小吗,是任务管理器里面显示的内存大小?

0
悬赏园豆:10 [已解决问题] 解决于 2015-08-10 15:31

通过Process类发现找不到进程内存的值,这个值可以通过PerformanceCounter 获取

PerformanceCounter counter = new PerformanceCounter("Process","Working Set - Private");

能不能通过Process类里面的值计算出这个值?

秦随境迁的主页 秦随境迁 | 初学一级 | 园豆:111
提问于:2015-07-29 16:39
< >
分享
最佳答案
2

Process.WorkingSet64 就是内存占用大小

收获园豆:5
jio92 | 小虾三级 |园豆:1064 | 2015-07-29 16:45
//
        // 摘要:
        //     获取关联进程的物理内存使用情况。
        //
        // 返回结果:
        //     关联进程当前使用的物理内存总量(以字节为单位)。
        //
        // 异常:
        //   System.PlatformNotSupportedException:
        //     此平台为 Windows 98 或 Windows Millennium Edition (Windows Me),它不支持此属性。
        [Obsolete("This property has been deprecated.  Please use System.Diagnostics.Process.WorkingSet64 instead.  http://go.microsoft.com/fwlink/?linkid=14202")]
        [MonitoringDescription("ProcessWorkingSet")]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public int WorkingSet { get; }
        //
        // 摘要:
        //     获取为关联的进程分配的物理内存量。
        //
        // 返回结果:
        //     为关联的进程分配的物理内存量(以字节为单位)。
        //
        // 异常:
        //   System.PlatformNotSupportedException:
        //     此平台为 Windows 98 或 Windows Millennium Edition (Windows Me),它不支持此属性。
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        [MonitoringDescription("ProcessWorkingSet")]
        [ComVisible(false)]
        public long WorkingSet64 { get; }

 

jio92 | 园豆:1064 (小虾三级) | 2015-07-29 16:48

这个和任务管理器里面的数值是不一样的,我是想获取任务管理器里面的那个内存值,也就是资源管理器里面对应的“专用”那一列

秦随境迁 | 园豆:111 (初学一级) | 2015-07-29 16:49

@秦随境迁: 那就用PerformanceCounter 

jio92 | 园豆:1064 (小虾三级) | 2015-07-29 17:01

@秦随境迁: 这个内存是有很多 什么工作集 高峰工作集 等等, 你说的"专用"实际上是私有工作集

var ps = Process.GetCurrentProcess();
PerformanceCounter pf1 = new PerformanceCounter("Process", "Working Set - Private", ps.ProcessName);   //第二个参数就是得到只有工作集

Console.WriteLine("{0}:{1}  {2:N}KB", ps.ProcessName, "私有工作集    ", pf1.NextValue()/1024);   //这个就是私有工作集占用物理内存大小
jio92 | 园豆:1064 (小虾三级) | 2015-07-29 17:07

@jio92: 

这里有篇详细介绍的文章:http://www.cnblogs.com/maowang1991/archive/2013/08/27/3285983.html

jio92 | 园豆:1064 (小虾三级) | 2015-07-29 17:08

@jio92: 这个我也考虑过了,不过用PerformanceCounter的话会导致程序的CPU占用过高

秦随境迁 | 园豆:111 (初学一级) | 2015-07-29 17:09

@秦随境迁: 肯定啊  这个涉及到性能计数器  他要计算 占用肯定会高, 要不你就用API来获取

jio92 | 园豆:1064 (小虾三级) | 2015-07-29 17:16

@秦随境迁: 这个内存占用它肯定不是一个定值,所以你不可能通过一个属性来得到这个值,就算有也不准确,还是要通过计算来得到当前准确值

jio92 | 园豆:1064 (小虾三级) | 2015-07-29 17:18
其他回答(2)
0

如果有放弃process类的想法,可以考虑下通过window api获取,参考ProcessHacker项目

收获园豆:3
visonme | 园豆:1674 (小虾三级) | 2015-07-29 16:47

谢谢分享,暂时只考虑用Process类,我看了下那个项目,他获取的内存值和上面那位说的是一样的,我暂时也用那个吧

支持(0) 反对(0) 秦随境迁 | 园豆:111 (初学一级) | 2015-07-29 17:01
0

1、取当前进程占用内存

var workingSet = Environment.WorkingSet / (1024 * 1024);通过这行代码很容易拿到当前进程占用内存,单位是MB

2、取非当前进程占用内存

var workingSet = Process.WorkingSet64 / (1024 * 1024); 单位是MB

收获园豆:2
JeffWong | 园豆:2328 (老鸟四级) | 2015-07-29 17:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册