java怎样获取CPU占用率和硬盘占用率

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java怎样获取CPU占用率和硬盘占用率相关的知识,希望对你有一定的参考价值。

通过jmx可以监控vm内存使用,系统内存使用等,以下是网上某博客代码,特点是通过window和linux命令获得CPU使用率。 

 利用java程序实现获取计算机cpu利用率和内存使用信息。   

package com.amgkaka.performance;   
  
/** *//**  
 * 监视信息的JavaBean类.  
 * @author  amg  
 * @version 1.0   
 * Creation date: 2008-4-25 - 上午10:37:00  
 */  
public class MonitorInfoBean    
    /** *//** 可使用内存. */  
    private long totalMemory;   
       
    /** *//** 剩余内存. */  
    private long freeMemory;   
       
    /** *//** 最大可使用内存. */  
    private long maxMemory;   
       
    /** *//** 操作系统. */  
    private String osName;   
       
    /** *//** 总的物理内存. */  
    private long totalMemorySize;   
       
    /** *//** 剩余的物理内存. */  
    private long freePhysicalMemorySize;   
       
    /** *//** 已使用的物理内存. */  
    private long usedMemory;   
       
    /** *//** 线程总数. */  
    private int totalThread;   
       
    /** *//** cpu使用率. */  
    private double cpuRatio;   
  
    public long getFreeMemory()    
        return freeMemory;   
       
  
    public void setFreeMemory(long freeMemory)    
        this.freeMemory = freeMemory;   
       
  
    public long getFreePhysicalMemorySize()    
        return freePhysicalMemorySize;   
       
  
    public void setFreePhysicalMemorySize(long freePhysicalMemorySize)    
        this.freePhysicalMemorySize = freePhysicalMemorySize;   
       
  
    public long getMaxMemory()    
        return maxMemory;   
       
  
    public void setMaxMemory(long maxMemory)    
        this.maxMemory = maxMemory;   
       
  
    public String getOsName()    
        return osName;   
       
  
    public void setOsName(String osName)    
        this.osName = osName;   
       
  
    public long getTotalMemory()    
        return totalMemory;   
       
  
    public void setTotalMemory(long totalMemory)    
        this.totalMemory = totalMemory;   
       
  
    public long getTotalMemorySize()    
        return totalMemorySize;   
       
  
    public void setTotalMemorySize(long totalMemorySize)    
        this.totalMemorySize = totalMemorySize;   
       
  
    public int getTotalThread()    
        return totalThread;   
       
  
    public void setTotalThread(int totalThread)    
        this.totalThread = totalThread;   
       
  
    public long getUsedMemory()    
        return usedMemory;   
       
  
    public void setUsedMemory(long usedMemory)    
        this.usedMemory = usedMemory;   
       
  
    public double getCpuRatio()    
        return cpuRatio;   
       
  
    public void setCpuRatio(double cpuRatio)    
        this.cpuRatio = cpuRatio;   
       

参考技术A /** *//**  
     * 获得CPU使用率.  
     * @return 返回cpu使用率  
     */  
    private double getCpuRatioForWindows()    
        try    
            String procCmd = System.getenv("windir")   
                    + "\\system32\\wbem\\wmic.exe process get Caption,CommandLine,"  
                    + "KernelModeTime,ReadOperationCount,ThreadCount,UserModeTime,WriteOperationCount";   
            // 取进程信息   
            long[] c0 = readCpu(Runtime.getRuntime().exec(procCmd));   
            Thread.sleep(CPUTIME);   
            long[] c1 = readCpu(Runtime.getRuntime().exec(procCmd));   
            if (c0 != null && c1 != null)    
                long idletime = c1[0] - c0[0];   
                long busytime = c1[1] - c0[1];   
                return Double.valueOf(   
                        PERCENT * (busytime) / (busytime + idletime))   
                        .doubleValue();   
             else    
                return 0.0;   
               
         catch (Exception ex)    
            ex.printStackTrace();   
            return 0.0;   
           
    

怎样解决软件启动CPU占用率瞬间变高,导致软件启动变慢的问题;C++ Builder(BCB) 开发的大概有30个FORM

C++ Builder(BCB) 开发的软件大概有30个FORM,没有动态链接(DLL),没有线程.跑起来后一切正常.就是启动慢要8s......
求解决方法...

有用的回答可以再加一百分
我现在将一半的FORM进行动态创建了,可速度只是比以前快了1秒,看来动态也起不了什么作用了,求解决法子.........

CPU占用率高的九种可能
1、防杀毒软件造成故障
由于新版的KV、金山、瑞星都加入了对网页、插件、邮件的随机监控,无疑增大了系统负担。处理方式:基本上没有合理的处理方式,尽量使用最少的监控服务吧,者,升级你的硬件配备。
2、驱动没有经过认证,造成CPU资源占用100%
大量的测试版的驱动在网上泛滥,造成了难以发现的故障原因。 处理方式:尤其是显卡驱动特别要注意,建议使用微软认证的或由官方发布的驱动,并且严格核对型号、版本。
3、病毒、木马造成
大量的蠕虫病毒在系统内部迅速复制,造成CPU占用资源率据高不下。解决办法:用可靠的杀毒软件彻底清理系统内存和本地硬盘,并且打开系统设置软件,察看有无异常启动的程序。经常性更新升级杀毒软件和防火墙,加强防毒意识,掌握正确的防杀毒知识。
4、控制面板—管理工具—服务—RISING REALTIME MONITOR SERVICE点鼠标右键,改为手动。
5、开始->;运行->;msconfig->;启动,关闭不必要的启动项,重启。
6、查看“svchost”进程。
svchost.exe是Windows XP系统的一个核心进程。svchost.exe不单单只出现在Windows XP中,在使用NT内核的Windows系统中都会有svchost.exe的存在。一般在Windows 2000中svchost.exe进程的数目为2个,而在Windows XP中svchost.exe进程的数目就上升到了4个及4个以上。
7、查看网络连接。主要是网卡。
8、查看网络连接
当安装了Windows XP的计算机做服务器的时候,收到端口 445 上的连接请求时,它将分配内存和少量地调配 CPU资源来为这些连接提供服务。当负荷过重的时候,CPU占用率可能过高,这是因为在工作项的数目和响应能力之间存在固有的权衡关系。你要确定合适的 MaxWorkItems 设置以提高系统响应能力。如果设置的值不正确,服务器的响应能力可能会受到影响,或者某个用户独占太多系统资源。
要解决此问题,我们可以通过修改注册表来解决:在注册表编辑器中依次展开[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServiceslanmanserver ]分支,在右侧窗口中新建一个名为“maxworkitems”的DWORD值。然后双击该值,在打开的窗口中键入下列数值并保存退出:
9、看看是不是Windows XP使用鼠标右键引起CPU占用100%
在资源管理器里面,当你右键点击一个目录或一个文件,你将有可能出现下面所列问题:
任何文件的拷贝操作在那个时间将有可能停止相应
网络连接速度将显著性的降低
所有的流输入/输出操作例如使用Windows Media Player听音乐将有可能是音乐失真成因:
当你在资源管理器里面右键点击一个文件或目录的时候,当快捷菜单显示的时候,CPU占用率将增加到100%,当你关闭快捷菜单的时候才返回正常水平。
解决方法:
文字较多,请看链接http://help.360.cn/index.php?c=help&a=topic&bid=5030806&tid=19726210

参考资料:http://help.360.cn/index.php?c=help&a=topic&bid=5030806&tid=19726210

参考技术A 呵呵,这个问题很容易解决,你把除了mainForm以外的所有的Form都设置成动态生成就不会那么占用内存了!追问

内存倒不高,就是CPU瞬间变高

追答

你的Form是不是都是静态生成的?

追问

没有一个是动态的,悲剧啊!

追答

呵呵,那真是很悲剧!
最好做到动态生成、关闭后动态删除!这样程序的运行就不会占用那么多的电脑资源!

参考技术B 我觉得应该是你的 界面别 文件操作或者数据库操作阻塞住了。
这些 磁盘的操作可以尽量放到后台线程里面慢慢加载,先显示界面,不要block住主线程
参考技术C 启动慢可以减少启动时同步加载的资源,如果必须加载就采用类似PhotoShop那样的启动画面,来减少由于启动时间过长造成的用户体验差的情况
至于CPU占用瞬间变高?会有多高?在什么样CPU的机器上进行的测试?一般来说多核CPU如果单线程启动的程序都不会占用很多的吧追问

工作电脑 E2200 2.2GHz ---->启动8-9秒 占用率40-47%

I3 CPU 启动5-6秒 占用30%左右

追答

说实话这个数据不是很高,除非文档中有特殊要求
因为启动时间有这么长,说明启动时加载的内容较多,可以从构造函数OnLoad时减少部分,或者推迟到OnShow之后进行,不过这个时候加载会让界面卡上一段时间
如果都是必须的话,就是建议用启动画面的方法,这样的用户体验较好,类似office那种

另外,能把一些启动的执行流,或者代码说出来嘛,至少对你的程序启动有个认识

参考技术D 没有必要不要一次创建这么多form,,启动时只创建几个必须的就行了,应用时再用new来创建。设计问题,这回代价大了。追问

你的意思是因为一次启动的FORM太多了才导致cpu过高? 我不知道是不是所有的FORM都跟随软件的启动一起动起来了/

追答

从经验上说当然很有可能,当然也可能是连接数据库时产生的。一般开发过几个窗口程序之后,就不会采用这样的设计了。

以上是关于java怎样获取CPU占用率和硬盘占用率的主要内容,如果未能解决你的问题,请参考以下文章

原创Java获取CPU占用率内存占用率最简单的方式

CPU占用率100%的九种可能及解决方法

c程序cpu占用率

c语言的cpu占用率

我的电脑cpu占用率老是接近100%是怎么回事?

Linux系统下怎样查看进程的CPU占用率