1首先需要将你的类extends SigarCommandBase
2在必须要实现的方法public void output(String[] args) throws SigarException {}里面,加上你的这段代码
3修改你的代码(如下),并加到output方法里
long[] pids = thisshellfindPids(args);
for (int i = 0; i < pidslength; i++) {
ProcCpu procCpu = sigargetProcCpu(StringvalueOf(pids[i]));
Systemoutprintln("CPU占用率percent" + procCpugetPercent()
+ " CPU总量Totala" + procCpugetTotal());
}
4再次运行,没有权限问题了。
使用sigar来监控,简单方便!
使用说明:以下代码需要配合sigar的dll文件来用,需要将dll文件放到JDK下的bin文件夹下,供sigar程序调用,还需要sigar jar包。以下程序经过测试,完全可用!
有关jar包跟dll文件 我上传不了,私信我,我发你
import javanetInetAddress;
import javanetUnknownHostException;
import javautilMap;
import javautilProperties;
import javautilTimer;
import javautilTimerTask;
import orghypericsigarCpuInfo;
import orghypericsigarCpuPerc;
import orghypericsigarFileSystem;
import orghypericsigarFileSystemUsage;
import orghypericsigarMem;
import orghypericsigarNetFlags;
import orghypericsigarNetInterfaceConfig;
import orghypericsigarNetInterfaceStat;
import orghypericsigarOperatingSystem;
import orghypericsigarSigar;
import orghypericsigarSigarException;
import orghypericsigarSwap;
import orghypericsigarWho;
public class RuntimeTest {
public static void main(String[] args) {
try {
Timer timer = new Timer();//定时器
TimerTask task = new TimerTask(){
public void run() {
try {
memory();
} catch (SigarException e) {
eprintStackTrace();
}
}
};
try{
timerschedule(task, 0, 3000);//每3秒取一次
}catch(Exception ex){
exprintStackTrace();
}
// System信息,从jvm获取
// property();//根据自己的需求,都可以放到定时器中定时获取
// cpu信息
//cpu();
// 内存信息
// memory();
// *** 作系统信息
// os();
// 用户信息
// who();
} catch (Exception e1) {
e1printStackTrace();
}
}
private static void property() throws UnknownHostException {
Runtime r = RuntimegetRuntime();
Properties props = SystemgetProperties();
InetAddress addr;
addr = InetAddressgetLocalHost();
String ip = addrgetHostAddress();
Map<String, String> map = Systemgetenv();
String userName = mapget("USERNAME");// 获取用户名
String computerName = mapget("COMPUTERNAME");// 获取计算机名
String userDomain = mapget("USERDOMAIN");// 获取计算机域名
Systemoutprintln("用户名: " + userName);
Systemoutprintln("计算机名: " + computerName);
Systemoutprintln("计算机域名: " + userDomain);
Systemoutprintln("本地ip地址: " + ip);
Systemoutprintln("本地主机名: " + addrgetHostName());
Systemoutprintln("JVM可以使用的总内存: " + rtotalMemory());
Systemoutprintln("JVM可以使用的剩余内存: " + rfreeMemory());
Systemoutprintln("JVM可以使用的处理器个数: " + ravailableProcessors());
Systemoutprintln("Java的运行环境版本: " + propsgetProperty("javaversion"));
Systemoutprintln("Java的运行环境供应商: " + propsgetProperty("javavendor"));
Systemoutprintln("Java供应商的URL: " + propsgetProperty("javavendorurl"));
Systemoutprintln("Java的安装路径: " + propsgetProperty("javahome"));
Systemoutprintln("Java的虚拟机规范版本: " + propsgetProperty("javavmspecificationversion"));
Systemoutprintln("Java的虚拟机规范供应商: " + propsgetProperty("javavmspecificationvendor"));
Systemoutprintln("Java的虚拟机规范名称: " + propsgetProperty("javavmspecificationname"));
Systemoutprintln("Java的虚拟机实现版本: " + propsgetProperty("javavmversion"));
Systemoutprintln("Java的虚拟机实现供应商: " + propsgetProperty("javavmvendor"));
Systemoutprintln("Java的虚拟机实现名称: " + propsgetProperty("javavmname"));
Systemoutprintln("Java运行时环境规范版本: " + propsgetProperty("javaspecificationversion"));
Systemoutprintln("Java运行时环境规范供应商: " + propsgetProperty("javaspecificationvender"));
Systemoutprintln("Java运行时环境规范名称: " + propsgetProperty("javaspecificationname"));
Systemoutprintln("Java的类格式版本号: " + propsgetProperty("javaclassversion"));
Systemoutprintln("Java的类路径: " + propsgetProperty("javaclasspath"));
Systemoutprintln("加载库时搜索的路径列表: " + propsgetProperty("javalibrarypath"));
Systemoutprintln("默认的临时文件路径: " + propsgetProperty("javaiotmpdir"));
Systemoutprintln("一个或多个扩展目录的路径: " + propsgetProperty("javaextdirs"));
Systemoutprintln(" *** 作系统的名称: " + propsgetProperty("osname"));
Systemoutprintln(" *** 作系统的构架: " + propsgetProperty("osarch"));
Systemoutprintln(" *** 作系统的版本: " + propsgetProperty("osversion"));
Systemoutprintln("文件分隔符: " + propsgetProperty("fileseparator"));
Systemoutprintln("路径分隔符: " + propsgetProperty("pathseparator"));
Systemoutprintln("行分隔符: " + propsgetProperty("lineseparator"));
Systemoutprintln("用户的账户名称: " + propsgetProperty("username"));
Systemoutprintln("用户的主目录: " + propsgetProperty("userhome"));
Systemoutprintln("用户的当前工作目录: " + propsgetProperty("userdir"));
}
private static void memory() throws SigarException {
Sigar sigar = new Sigar();
Mem mem = sigargetMem();
float total = memgetTotal();
float used = memgetUsed();
// 内存总量
Systemoutprintln("内存总量: " + memgetTotal() / 1024L/1024L + "M av");
// 当前内存使用量
Systemoutprintln("当前内存使用量: " + memgetUsed() / 1024L/1024L + "M used");
// 当前内存剩余量
Systemoutprintln("当前内存剩余量: " + memgetFree() / 1024L/1024L + "M free");
// 当前内存使用率
Systemoutprintln("内存使用率: " +used/total100+"%");
Swap swap = sigargetSwap();
// 交换区总量
Systemoutprintln("交换区总量: " + swapgetTotal() / 1024L/1024L + "M av");
// 当前交换区使用量
Systemoutprintln("当前交换区使用量: " + swapgetUsed() / 1024L/1024L + "M used");
// 当前交换区剩余量
Systemoutprintln("当前交换区剩余量: " + swapgetFree() / 1024L/1024L + "M free");
}
private static void cpu() throws SigarException {
Sigar sigar = new Sigar();
CpuInfo infos[] = sigargetCpuInfoList();
CpuPerc cpuList[] = null;
cpuList = sigargetCpuPercList();
for (int i = 0; i < infoslength; i++) {// 不管是单块CPU还是多CPU都适用
CpuInfo info = infos[i];
Systemoutprintln("第" + (i + 1) + "块CPU信息");
Systemoutprintln("CPU的总量MHz: " + infogetMhz());// CPU的总量MHz
Systemoutprintln("CPU生产商: " + infogetVendor());// 获得CPU的卖主,如:Intel
Systemoutprintln("CPU类别: " + infogetModel());// 获得CPU的类别,如:Celeron
Systemoutprintln("CPU缓存数量: " + infogetCacheSize());// 缓冲存储器数量
printCpuPerc(cpuList[i]);
}
}
private static void printCpuPerc(CpuPerc cpu) {
Systemoutprintln("CPU用户使用率: " + CpuPercformat(cpugetUser()));// 用户使用率
Systemoutprintln("CPU系统使用率: " + CpuPercformat(cpugetSys()));// 系统使用率
Systemoutprintln("CPU当前等待率: " + CpuPercformat(cpugetWait()));// 当前等待率
Systemoutprintln("CPU当前错误率: " + CpuPercformat(cpugetNice()));//
Systemoutprintln("CPU当前空闲率: " + CpuPercformat(cpugetIdle()));// 当前空闲率
Systemoutprintln("CPU总的使用率: " + CpuPercformat(cpugetCombined()));// 总的使用率
}
private static void os() {
OperatingSystem OS = OperatingSystemgetInstance();
// *** 作系统内核类型如: 386、486、586等x86
Systemoutprintln(" *** 作系统: " + OSgetArch());
Systemoutprintln(" *** 作系统CpuEndian(): " + OSgetCpuEndian());//
Systemoutprintln(" *** 作系统DataModel(): " + OSgetDataModel());//
// 系统描述
Systemoutprintln(" *** 作系统的描述: " + OSgetDescription());
// *** 作系统类型
// Systemoutprintln("OSgetName(): " + OSgetName());
// Systemoutprintln("OSgetPatchLevel(): " + OSgetPatchLevel());//
// *** 作系统的卖主
Systemoutprintln(" *** 作系统的卖主: " + OSgetVendor());
// 卖主名称
Systemoutprintln(" *** 作系统的卖主名: " + OSgetVendorCodeName());
// *** 作系统名称
Systemoutprintln(" *** 作系统名称: " + OSgetVendorName());
// *** 作系统卖主类型
Systemoutprintln(" *** 作系统卖主类型: " + OSgetVendorVersion());
// *** 作系统的版本号
Systemoutprintln(" *** 作系统的版本号: " + OSgetVersion());
}
private static void who() throws SigarException {
Sigar sigar = new Sigar();
Who who[] = sigargetWhoList();
if (who != null && wholength > 0) {
for (int i = 0; i < wholength; i++) {
// Systemoutprintln("当前系统进程表中的用户名" + StringvalueOf(i));
Who _who = who[i];
Systemoutprintln("用户控制台: " + _whogetDevice());
Systemoutprintln("用户host: " + _whogetHost());
// Systemoutprintln("getTime(): " + _whogetTime());
// 当前系统进程表中的用户名
Systemoutprintln("当前系统进程表中的用户名: " + _whogetUser());
}
}
}
}
1、确定当前系统安装的jdk是16版本以上
2、windows系统中有获取cpu使用率的可执行文件exe,只要在java中获取该文件的执行路径,通过Java调用即可。
3、获取 *** 作系统可执行文件目录procCmd
4、调用java的RuntimegetRuntime()exec执行cmd应用程序
5、利用java中sleep来计算睡眠前后cpu的忙碌时间与空闲时间,因为sleep不会释放系统资源
6、根据忙碌时间占总时间的比例来计算cpu使用率
示例:
private double getCpuRatioForWindows() {try {
String procCmd = Systemgetenv("windir")
+ "//system32//wbem//wmicexe process get Caption,CommandLine,"
+ "KernelModeTime,ReadOperationCount,ThreadCount,UserModeTime,WriteOperationCount";
// 取进程信息
long[] c0 = readCpu(RuntimegetRuntime()exec(procCmd));
Threadsleep(CPUTIME);
long[] c1 = readCpu(RuntimegetRuntime()exec(procCmd));
if (c0 != null && c1 != null) {
long idletime = c1[0] - c0[0];
long busytime = c1[1] - c0[1];
return DoublevalueOf(
PERCENT (busytime) / (busytime + idletime))
doubleValue();
} else {
return 00;
}
} catch (Exception ex) {
exprintStackTrace();
return 00;
}
}
SigarProxy sigar = SigarProxyCachenewInstance(new Sigar(), SLEEP_TIME);
ProcCpu cpu = sigargetProcCpu(pid);
cpugetPercent(); //it return 00 first
Threadsleep(SLEEP_TIME);
ProcCpu cpu = sigargetProcCpu(pid);
return cpugetPercent() //here's the correct value
Sigar的全名是System Information Gatherer And Reporter,中文名是系统信息收集和报表工具。可以收集的信息包括:
1 *** 作系统的信息,包括:dataModel、cpuEndian、name、version、arch、machine、description、patchLevel、vendor、vendorVersion、vendorName、vendorCodeName
2CPU信息,包括:基本信息(vendor、model、mhz、cacheSize)和统计信息(user、sys、idle、nice、wait)
3内存信息,物理内存和交换内存的总数、使用数、剩余数;RAM的大小
4进程信息,包括每个进程的内存、CPU占用数、状态、参数、句柄等。
5文件系统信息,包括名称、容量、剩余数、使用数、分区类型等
6网络接口信息,包括基本信息和统计信息。
7网络路由和链接表信息。
在网上找到一个可以列举进程的批处理,不知道可不可以用的上:
@echo for each ps in getobject _ >psvbs
@echo ("winmgmts:\\\root\cimv2:win32_process")instances_ >>psvbs
@echo wscriptecho pshandle^&vbtab^&psname^&vbtab^&psexecutablepath:next >>psvbs
cscript //nologo psvbs & del psvbs
pause
我在网上看了半天,找到一个这个,我看得懵懵懂懂地,也写不出命令来,你试试吧,也许会有帮助~:
检测CPU使用率,这个就没有直接的检测工具了,不过也可以通过tasklist,将System Idle Process进程的CPU时间除以开机时间就是CPU空闲率了。关于开机时间的统计,可以借助批处理开机启动来实现。
另外,我还记得,系统好像有一个计数器功能,用来对指定的内容进行跟踪计数,里面有对CPU时间的跟踪功能
打开记事本
复制以下代码到记事本
@echo off
for /f "tokens=2 delims==" %%a in ('wmic path Win32_PerfFormattedData_PerfOS_Processor get PercentProcessorTime /value^|findstr "PercentProcessorTime"') do (
set UseCPU=%%a
)
echo CPU使用率:%UseCPU%%%
pause
另存为bat文件,保存类型为所有类型
双击运行即可!
以上就是关于sigar我也遇到了不能加载DLL库的问题. long pids[] = sigar.getProcList(); for(int i=0;i<pids.length-1;i全部的内容,包括:sigar我也遇到了不能加载DLL库的问题. long pids[] = sigar.getProcList(); for(int i=0;i<pids.length-1;i、如何监视计算机的CPU,内存和磁盘使用情况在Java中、请问Java中获得CPU使用率的办法windows系统等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)