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,第1张

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系统等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9501225.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存