java获得某进程CPU占用率

来源:互联网 发布:linux 新建脚本 编辑:程序博客网 时间:2024/06/11 14:19

昨天碰到一个问题,用java根据进程号获得该进程的CPU占用率。


在网上找了很多例子,都是用一个sigar.jar包去做的,下载下来以后,根据示例代码,发现获得的进程CPU占用率都是0.0,不知何故。


在网上找了很多例子,也没几个人说到重点。有人说用Thread.sleep(SLEEP_TIME); 但他的代码没给清楚,而且自己也无法解释原因(当然最后是用sleep解决的)。


我也试了很多次,而且发现一个很奇怪的现象,对同一个进程,调用多次sigar.getProcCpu(pid).getPercent();,返回的结果第一次是0.0,第二次或以后的N次都是一个非常小的数(大约是10的负几百次方),大惑不解。


之前一度以为是权限的问题,系统不让调用类似信息。


后来无奈之下,在网上找了两篇C语言调WindowsAPI去获得某进程的CPU占用率的方法。发现这个方法中要调用两次同样的函数。虽然看不懂代码,但知道大致的原理。在那个函数中有个静态变量,第一次调用的时候会记下当前的时刻,下次调用的时候又会记下本次调用当前的时刻,并与上次调用的时刻相减。严格地说并不能叫时刻,这个函数应该是会开启两个计数器,一个用于记录CPU流逝的时间,另一个用于记录指定进程的流逝时间。比方说CPU一共经历了100个滴答,但这个进程却只经历了10个滴答,那它的CPU占用率就是10%。


想用java调用C生产的可执行文件(还没有到用JNI调用C函数的层次,只是通过Runtime调用本地可执行文件),但发现在有的电脑上行得通,有的电脑上会有权限问题。


今天又问了一个学长之前用java没成功是否也是权限问题(其实这会儿我已经得到足够多的提示了,只是自己还没动脑筋仔细想,本来自己应该能琢磨出来的),学长立马给我指出,让我调用sigar提供的方法,调用两次,中间间隔一定时间,试试。

果然成功了。

后来一细想,其实java用的也是C的那个原理。怎么自己没想出来呢?


至此,这个问题搞定。



另:解决问题的中途学到的知识:

1、如何在java项目中配置相对路径的JAR包:将JAR包拷到项目目录下,在项目的Build Path / Configure Build Path / Libraries 中点击右边最上面的Add JARs,然后在项目目录下找到对应jar包即可。

2、在Win32 Console Application中如何不显示控制台: 在代码的第一行加入如下一行代码:

#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")

即可。


仍存在的问题:

1、对某一个文件,用"wr" 方式打开,写完之后,用rewind()或fseek()试图将文件的位置指针跳至文件头,从头开始读,失败。最终用freopen()解决。不知rewind()和fseek()为何不可。

0 0
原创粉丝点击