如何监控Java应用程序的Windows监控jvm内存使用情况况

Java内存泄漏是每个Java程序员都会遇到的问题,程序在本地运行一切正常,可是布署到远端就会出现内存无限制的增长,最后系统瘫痪,那么如何最快最好的检测程序的稳定性,防止系统崩盘,作者用自已的亲身经历与各位分享解决这些问题的办法.
作为Internet最流行的编程语言之一,Java现正非常流行.我们的网络应用程序就主要采用Java语言开发,大体上分为客户端、服务器和数据库三个层次.在进入测试过程中,我们发现有一个程序模块系统内存和CPU资源消耗急剧增加,持续增长到出现java.lang.OutOfMemoryError为止.经过分析Java内存泄漏是破坏系统的主要因素.这里与大家分享我们在开发过程中遇到的Java内存泄漏的检测和处理解决过程.
一. Java是如何管理内存
为了判断Java中是否有内存泄露,我们首先必须了解Java是如何管理内存的.Java的内存管理就是对象的分配和释放问题.在Java中,内存的分配是由程序完成的,而内存的释放是由垃圾收集器(Garbage Collection,GC)完成的,程序员不需要通过调用函数来释放内存,但它只能回收无用并且不再被其它对象引用的那些对象所占用的空间.
Java的内存垃圾回收机制是从程序的主要运行对象开始检查引用链,当遍历一遍后发现没有被引用的孤立对象就作为垃圾回收.GC为了能够正确释放对象,必须监控每一个对象的运行状态,包括对象的申请、引用、被引用、赋值等,GC都需要进行监控.监视对象状态是为了更加准确地、及时地释放对象,而释放对象的根本原则就是该对象不再被引用.
在Java中,这些无用的对象都由GC负责回收,因此程序员不需要考虑这部分的内存泄露.虽然,我们有几个函数可以访问GC,例如运行GC的函数System.gc(),但是根据Java语言规范定义,该函数不保证JVM的垃圾收集器一定会执行.因为不同的JVM实现者可能使用不同的算法管理GC.通常GC的线程的优先级别较低.JVM调用GC的策略也有很多种,有的是内存使用到达一定程度时,GC才开始工作,也有定时执行的,有的是平缓执行GC,有的是中断式执行GC.但通常来说,我们不需要关心这些.
二. 什么是Java中的内存泄露
导致内存泄漏主要的原因是,先前申请了内存空间而忘记了释放.如果程序中存在对无用对象的引用,那么这些对象就会驻留内存,消耗内存,因为无法让垃圾回收器GC验证这些对象是否不再需要.如果存在对象的引用,这个对象就被定义为"有效的活动",同时不会被释放.要确定对象所占内存将被回收,我们就要务必确认该对象不再会被使用.典型的做法就是把对象数据成员设为null或者从集合中移除该对象.但当局部变量不需要时,不需明显的设为null,因为一个方法执行完毕时,这些引用会自动被清理.
在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点,首先,这些对象是有被引用的,即在有向树形图中,存在树枝通路可以与其相连;其次,这些对象是无用的,即程序以后不会再使用这些对象.如果对象满足这两个条件,这些对象就可以判定为Java中的内存泄漏,这些对象不会被GC所回收,然而它却占用内存.
这里引用一个常看到的例子,在下面的代码中,循环申请Object对象,并将所申请的对象放入一个Vector中,如果仅仅释放对象本身,但因为Vector仍然引用该对象,所以这个对象对GC来说是不可回收的.因此,如果对象加入到Vector后,还必须从Vector中删除,最简单的方法就是将Vector对象设置为null.
实际上这些对象已经是无用的,但还被引用,GC就无能为力了(事实上GC认为它还有用),这一点是导致内存泄漏最重要的原因. 再引用另一个例子来说明Java的内存泄漏.假设有一个日志类Logger,其提供一个静态的log(String msg),任何其它类都可以调用Logger.Log(message)来将message的内容记录到系统的日志文件中.
Logger类有一个类型为HashMap的静态变量temp,每次在执行log(message)的时候,都首先将message的值写入temp中(以当前线程+当前时间为键),在退出之前再从temp中将以当前线程和当前时间为键的条目删除.注意,这里当前时间是不断变化的,所以log在退出之前执行删除条目的操作并不能删除执行之初写入的条目.这样,任何一个作为参数传给log的字符串最终由于被Logger的静态变量temp引用,而无法得到回收,这种对象保持就是我们所说的Java内存泄漏. 总的来说,内存管理中的内存泄漏产生的主要原因:保留下来却永远不再使用的对象引用.
三. 几种典型的内存泄漏
我们知道了在Java中确实会存在内存泄漏,那么就让我们看一看几种典型的泄漏,并找出他们发生的原因和解决方法.
3.1 全局集合
在大型应用程序中存在各种各样的全局数据仓库是很普遍的,比如一个JNDI-tree或者一个session table.在这些情况下,必须注意管理储存库的大小.必须有某种机制从储存库中移除不再需要的数据.
通常有很多不同的解决形式,其中最常用的是一种周期运行的清除作业.这个作业会验证仓库中的数据然后清除一切不需要的数据.另一种管理储存库的方法是使用反向链接(referrer)计数.然后集合负责统计集合中每个入口的反向链接的数目.这要求反向链接告诉集合何时会退出入口.当反向链接数目为零时,该元素就可以从集合中移除了.
3.2 缓存&缓存一种用来快速查找已经执行过的操作结果的数据结构.因此,如果一个操作执行需要比较多的资源并会多次被使用,通常做法是把常用的输入数据的操作结果进行缓存,以便在下次调用该操作时使用缓存的数据.缓存通常都是以动态方式实现的,如果缓存设置不正确而大量使用缓存的话则会出现内存溢出的后果,因此需要将所使用的内存容量与检索数据的速度加以平衡.
常用的解决途径是使用java.lang.ref.SoftReference类坚持将对象放入缓存.这个方法可以保证当虚拟机用完内存或者需要更多堆的时候,可以释放这些对象的引用.
3.3 类装载器&*****Java类装载器的使用为内存泄漏提供了许多可乘之机.一般来说类装载器都具有复杂结构,因为类装载器不仅仅是只与"常规"对象引用有关,同时也和对象内部的引用有关.比如数据变量,方法和各种类.这意味着只要存在对数据变量,方法,各种类和对象的类装载器,那么类装载器将驻留在JVM中.既然类装载器可以同很多的类关联,同时也可以和静态数据变量关联,那么相当多的内存就可能发生泄漏.
四. 如何检测和处理内存泄漏
如何查找引起内存泄漏的原因一般有两个步骤:第一是安排有经验的编程人员对代码进行走查和分析,找出内存泄漏发生的位置;第二是使用专门的内存泄漏测试工具进行测试.
第一个步骤:在代码走查的工作中,可以安排对系统业务和开发语言工具比较熟悉的开发人员对应用的代码进行了交叉走查,尽量找出代码中存在的数据库连接声明和结果集未关闭、代码冗余等故障代码.
第二个步骤:就是检测Java的内存泄漏.在这里我们通常使用一些工具来检查Java程序的内存泄漏问题.市场上已有几种专业检查Java内存泄漏的工具,它们的基本工作原理大同小异,都是通过监测Java程序运行时,所有对象的申请、释放等动作,将内存管理的所有信息进行统计、分析、可视化.开发人员将根据这些信息判断程序是否有内存泄漏问题.这些工具包括Optimizeit Profiler,JProbe Profiler,JinSight , Rational 公司的Purify等.
4.1检测内存泄漏的存在&这里我们将简单介绍我们在使用Optimizeit检查的过程.通常在知道发生内存泄漏之后,第一步是要弄清楚泄漏了什么数据和哪个类的对象引起了泄漏.
一般说来,一个正常的系统在其运行稳定后其内存的占用量是基本稳定的,不应该是无限制的增长的.同样,对任何一个类的对象的使用个数也有一个相对稳定的上限,不应该是持续增长的.根据这样的基本假设,我们持续地观察系统运行时使用的内存的大小和各实例的个数,如果内存的大小持续地增长,则说明系统存在内存泄漏,如果特定类的实例对象个数随时间而增长(就是所谓的“增长率”),则说明这个类的实例可能存在泄漏情况.
另一方面通常发生内存泄漏的第一个迹象是:在应用程序中出现了OutOfMemoryError.在这种情况下,需要使用一些开销较低的工具来监控和查找内存泄漏.虽然OutOfMemoryError也有可能应用程序确实正在使用这么多的内存;对于这种情况则可以增加JVM可用的堆的数量,或者对应用程序进行某种更改,使它使用较少的内存.
但是,在许多情况下,OutOfMemoryError都是内存泄漏的信号.一种查明方法是不间断地监控GC的活动,确定内存使用量是否随着时间增加.如果确实如此,就可能发生了内存泄漏.
4.2处理内存泄漏的方法&一旦知道确实发生了内存泄漏,就需要更专业的工具来查明为什么会发生泄漏.JVM自己是不会告诉您的.这些专业工具从JVM获得内存系统信息的方法基本上有两种:JVMTI和字节码技术(byte code instrumentation).Java虚拟机工具接口(Java Virtual Machine Tools Interface,JVMTI)及其前身Java虚拟机监视程序接口(Java Virtual Machine Profiling Interface,JVMPI)是外部工具与JVM通信并从JVM收集信息的标准化接口.字节码技术是指使用探测器处理字节码以获得工具所需的信息的技术.
Optimizeit是Borland公司的产品,主要用于协助对软件系统进行代码优化和故障诊断,其中的Optimizeit Profiler主要用于内存泄漏的分析.Profiler的堆视图就是用来观察系统运行使用的内存大小和各个类的实例分配的个数的.
首先,Profiler会进行趋势分析,找出是哪个类的对象在泄漏.系统运行长时间后可以得到四个内存快照.对这四个内存快照进行综合分析,如果每一次快照的内存使用都比上一次有增长,可以认定系统存在内存泄漏,找出在四个快照中实例个数都保持增长的类,这些类可以初步被认定为存在泄漏.通过数据收集和初步分析,可以得出初步结论:系统是否存在内存泄漏和哪些对象存在泄漏(被泄漏).
接下来,看看有哪些其他的类与泄漏的类的对象相关联.前面已经谈到Java中的内存泄漏就是无用的对象保持,简单地说就是因为编码的错误导致了一条本来不应该存在的引用链的存在(从而导致了被引用的对象无法释放),因此内存泄漏分析的任务就是找出这条多余的引用链,并找到其形成的原因.查看对象分配到哪里是很有用的.同时只知道它们如何与其他对象相关联(即哪些对象引用了它们)是不够的,关于它们在何处创建的信息也很有用.
最后,进一步研究单个对象,看看它们是如何互相关联的.借助于Profiler工具,应用程序中的代码可以在分配时进行动态添加,以创建堆栈跟踪.也有可以对系统中所有对象分配进行动态的堆栈跟踪.这些堆栈跟踪可以在工具中进行累积和分析.对每个被泄漏的实例对象,必然存在一条从某个牵引对象出发到达该对象的引用链.处于堆栈空间的牵引对象在被从栈中弹出后就失去其牵引的能力,变为非牵引对象.因此,在长时间的运行后,被泄露的对象基本上都是被作为类的静态变量的牵引对象牵引.
总而言之, Java虽然有自动回收管理内存的功能,但内存泄漏也是不容忽视,它往往是破坏系统稳定性的重要因素.
Windows自带的Java内存查看命令
jinfo:可以输出并修改运行时的java 进程的opts。&jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。&jstat:一个极强的监视VM内存工具。可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量。&jmap:打印出某个java进程(使用pid)内存内的所有'对象'的情况(如:产生那些对象,及其数量)。&jconsole:一个java GUI监视工具,可以以图表化的形式显示各种数据。并可通过远程连接监视远程的服务器VM。&详细:在使用这些工具前,先用JPS命令获取当前的每个JVM进程号,然后选择要查看的JVM。&jstat工具特别强大,有众多的可选项,详细查看堆内各个部分的使用量,以及加载类的数量。使用时,需加上查看进程的进程id,和所选参数。以下详细介绍各个参数的意义。&jstat -class pid:显示加载class的数量,及所占空间等信息。&jstat -compiler pid:显示VM实时编译的数量等信息。&jstat -gc pid:可以显示gc的信息,查看gc的次数,及时间。其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。&jstat -gccapacity:可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小,如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。其他的可以根据这个类推, OC是old内纯的占用量。&jstat -gcnew pid:new对象的信息。&jstat -gcnewcapacity pid:new对象的信息及其占用量。&jstat -gcold pid:old对象的信息。&jstat -gcoldcapacity pid:old对象的信息及其占用量。&jstat -gcpermcapacity pid: perm对象的信息及其占用量。&jstat -util pid:统计gc信息统计。&jstat -printcompilation pid:当前VM执行的信息。&除了以上一个参数外,还可以同时加上 两个数字,如:jstat -printcompilation 是每250毫秒打印一次,一共打印6次,还可以加上-h3每三行显示一下标题。&jmap是一个可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成文本。&命令:jmap -dump:format=b,file=heap.bin &pid&&file:保存路径及文件名&pid:进程编号&ojmap -histo:live& pid| less :堆中活动的对象以及大小&ojmap -heap pid : 查看堆的使用状况信息&jinfo:的用处比较简单,就是能输出并修改运行时的java进程的运行参数。用法是jinfo -opt pid 如:查看2788的MaxPerm大小可以用 jinfo -flag MaxPermSize 2788。&jconsole是一个用java写的GUI程序,用来监控VM,并可监控远程的VM,非常易用,而且功能非常强。使用方法:命令行里打 jconsole,选则进程就可以了。&
JConsole中关于内存分区的说明。&Eden Space (heap): 内存最初从这个线程池分配给大部分对象。&Survivor Space (heap):用于保存在eden space内存池中经过垃圾回收后没有被回收的对象。&Tenured Generation (heap):用于保持已经在 survivor space内存池中存在了一段时间的对象。&Permanent Generation (non-heap): 保存虚拟机自己的静态(refective)数据,例如类(class)和方法(method)对象。Java虚拟机共享这些类数据。这个区域被分割为只读的和只写的,&Code Cache (non-heap):HotSpot Java虚拟机包括一个用于编译和保存本地代码(native code)的内存,叫做“代码缓存区”(code cache)&ojstack ( 查看jvm线程运行状态,是否有死锁现象等等信息) : jstack pid : thread dump&ojstat -gcutil& pid& & : 1000ms统计一次gc情况统计100次;&另外推荐一款查看jmap dump 的内存对象工具 MemoryAnalyzer&网址:http://www.eclipse.org/mat/,可以查看dump时对象数量,内存占用,线程情况等。
以及使用Memory Analyzer tool分析内存泄露
http://www.blogjava.net/rosen/archive//321575.html
阅读(...) 评论()如何查看java进程大批占用内存
如何查看java进程大量占用内存你好,方法如下:可以直接使用top命令后,查看%MEM的内容。可以选择按进程查看或者按用户查看,如想查看oracle用户的进程内存使用情况的话可以使用如下的命令:(1)toptop命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器可以直接使用top命令后,查看%MEM的内容。可以选择按进程查看或者按用户查看,如想查看oracle用户的进程内存使用情况的话可以使用如下的命令:$ top -u oracle内容解释:PID:进程的IDUSER:进程所有者PR:进程的优先级别,越小越优先被执行NInice:值VIRT:进程占用的虚拟内存RES:进程占用的物理内存SHR:进程使用的共享内存S:进程的状态。S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值为负数%CPU:进程占用CPU的使用率%MEM:进程使用的物理内存和总内存的百分比TIME+:该进程启动后占用的总的CPU时间,即占用CPU使用时间的累加值。COMMAND:进程启动命令名称常用的命令:P:按%CPU使用率排行T:按MITE+排行M:按%MEM排行(2)pmap可以根据进程查看进程相关信息占用的内存情况,(进程号可以通过ps查看)如下所示:$ pmap -d 14596(3)ps如下例所示:$ ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid'
其中rsz是是实际内存$ ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' | grep oracle |
sort -nrk5其中rsz为实际内存,上例实现按内存排序,由大到小
你好,方法如下:可以直接使用top命令后,查看%MEM的内容。可以选择按进程查看或者按用户查看,如想查看oracle用户的进程内存使用情况的话可以使用如下的命令:(1)toptop命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器可以直接使用top命令后,查看%MEM的内容。可以选择按进程查看或者按用户查看,如想查看oracle用户的进程内存使用情况的话可以使用如下的命令:$ top -u oracle内容解释:PID:进程的IDUSER:进程所有者PR:进程的优先级别,越小越优先被执行NInice:值VIRT:进程占用的虚拟内存RES:进程占用的物理内存SHR:进程使用的共享内存S:进程的状态。S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值为负数%CPU:进程占用CPU的使用率%MEM:进程使用的物理内存和总内存的百分比TIME+:该进程启动后占用的总的CPU时间,即占用CPU使用时间的累加值。COMMAND:进程启动命令名称常用的命令:P:按%CPU使用率排行T:按MITE+排行M:按%MEM排行(2)pmap可以根据进程查看进程相关信息占用的内存情况,(进程号可以通过ps查看)如下所示:$ pmap -d 14596(3)ps如下例所示:$ ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid'
其中rsz是是实际内存$ ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' | grep oracle |
sort -nrk5其中rsz为实际内存,上例实现按内存排序,由大到小
你按CTRL+ALT+DELETE,选择“进程”不也看的到吗?
你下个360最好,他可以清晰的看到后台程序和加载项,资源占用情况,还可以控制,很好用的一个软件。
现象描述用户咨询WIN7操作系统可以通过任务管理器查看到软件或进程所占用的物理内存,是否也可以查看到所占用的虚拟内存呢。(正常任务管理器如下图)
现象分析XP系统是无法在任务管理器直接查看的,但是WIN7系统已经具有此功能,可以直接在任务管理器查看。 解决方案1、按下Ctrl+Shift+Esc组合键,调出任务管理器,切换到“进程”标签下之后,单击“查看→选择列”(如图)。
2、在打开的“选择进程页列”窗口中,找到图中红色框选位置,将“内存-提交大小”勾选:
3、修改成功后,再次调用任务管理器,其中的“提交大小”那一列就是Windows 7中所指的虚拟内存。
不用下软件看,可以在任务管理器中查看。如果是开机启动项太多,可以在系统配置实用程序中把没必要随机开启的程序关掉(把前面的对勾去掉即可)
人的综合分
感谢您为社区的和谐贡献力量请选择举报类型
经过核实后将会做出处理感谢您为社区和谐做出贡献
确定要取消此次报名,退出该活动?博客分类:
利用java获取计算机cpu利用率和内存使用信息
1.pojo类:
public class MonitorInfoBean {
&&& /** 可使用内存. */
&&& private long totalM
&&&
&&& /** 剩余内存. */
&&& private long freeM
&&&
&&& /** 最大可使用内存. */
&&& private long maxM
&&&
&&& /** 操作系统. */
&&& private String osN
&&&
&&& /** 总的物理内存. */
&&& private long totalMemoryS
&&&
&&& /** 剩余的物理内存. */
&&& private long freePhysicalMemoryS
&&&
&&& /** 已使用的物理内存. */
&&& private long usedM
&&&
&&& /** 线程总数. */
&&& private int totalT
&&&
&&& /** cpu使用率. */
&&& private double cpuR
&&& public long getFreeMemory() {
&&&&&&& return freeM
&&& }
&&& public void setFreeMemory(long freeMemory) {
&&&&&&& this.freeMemory = freeM
&&& }
&&& public long getFreePhysicalMemorySize() {
&&&&&&& return freePhysicalMemoryS
&&& }
&&& public void setFreePhysicalMemorySize(long freePhysicalMemorySize) {
&&&&&&& this.freePhysicalMemorySize = freePhysicalMemoryS
&&& }
&&& public long getMaxMemory() {
&&&&&&& return maxM
&&& }
&&& public void setMaxMemory(long maxMemory) {
&&&&&&& this.maxMemory = maxM
&&& }
&&& public String getOsName() {
&&&&&&& return osN
&&& }
&&& public void setOsName(String osName) {
&&&&&&& this.osName = osN
&&& }
&&& public long getTotalMemory() {
&&&&&&& return totalM
&&& }
&&& public void setTotalMemory(long totalMemory) {
&&&&&&& this.totalMemory = totalM
&&& }
&&& public long getTotalMemorySize() {
&&&&&&& return totalMemoryS
&&& }
&&& public void setTotalMemorySize(long totalMemorySize) {
&&&&&&& this.totalMemorySize = totalMemoryS
&&& }
&&& public int getTotalThread() {
&&&&&&& return totalT
&&& }
&&& public void setTotalThread(int totalThread) {
&&&&&&& this.totalThread = totalT
&&& }
&&& public long getUsedMemory() {
&&&&&&& return usedM
&&& }
&&& public void setUsedMemory(long usedMemory) {
&&&&&&& this.usedMemory = usedM
&&& }
&&& public double getCpuRatio() {
&&&&&&& return cpuR
&&& }
&&& public void setCpuRatio(double cpuRatio) {
&&&&&&& this.cpuRatio = cpuR
&&& }
}
2. 实现类:
import java.io.BufferedR
import java.io.F
import java.io.IOE
import java.io.InputS
import java.io.InputStreamR
import java.io.LineNumberR
import java.util.StringT
import sun.management.ManagementF
import com.sun.management.OperatingSystemMXB
public class cpu {
&&& private static final int CPUTIME = 30;
&&&&& private static final int PERCENT = 100;
&&&&& private static final int FAULTLENGTH = 10;
&&&&&
&&&&& private static final File versionFile = new File("/proc/version");
&&&&& private static String linuxVersion =
&&&&&&&&&&& public double getCpuRatio(){
&&&&&&&&&&& // 操作系统
&&&&&&&&& String osName = System.getProperty("os.name");
&&&&&&&&&&& double cpuRatio = 0;
&&&&&&&&&& if (osName.toLowerCase().startsWith("windows")) {
&&&&&&&&&&&&&& return cpuRatio = this.getCpuRatioForWindows();
&&&&&&&&&& }
&&&&&&&&&& else {
&&&&&&&&&&&&&& return cpuRatio = this.getCpuRateForLinux();
&&&&&&&&&& }
&&&&&&&&&&& }
&&&&&
&&&&&& * 获得当前的监控对象.
&&&&&& * @return 返回构造好的监控对象
&&&&&& */
&&&&& public MonitorInfoBean getMonitorInfoBean() throws Exception {
&&&&&&&&& int kb = 1024;
&&&&&&&&&
&&&&&&&&& // 可使用内存
&&&&&&&&& long totalMemory = Runtime.getRuntime().totalMemory() /
&&&&&&&&& // 剩余内存
&&&&&&&&& long freeMemory = Runtime.getRuntime().freeMemory() /
&&&&&&&&& // 最大可使用内存
&&&&&&&&& long maxMemory = Runtime.getRuntime().maxMemory() /
&&&&&&&&& OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ManagementFactory
&&&&&&&&&&&&&&&&& .getOperatingSystemMXBean();
&&&&&&&&& // 操作系统
&&&&&&&&& String osName = System.getProperty("os.name");
&&&&&&&&& // 总的物理内存
&&&&&&&&& long totalMemorySize = osmxb.getTotalPhysicalMemorySize() /
&&&&&&&&& // 剩余的物理内存
&&&&&&&&& long freePhysicalMemorySize = osmxb.getFreePhysicalMemorySize() /
&&&&&&&&& // 已使用的物理内存
&&&&&&&&& long usedMemory = (osmxb.getTotalPhysicalMemorySize() - osmxb
&&&&&&&&&&&&&&&&& .getFreePhysicalMemorySize())
&&&&&&&&&&&&&&&&& /
&&&&&&&&& // 获得线程总数
&&&&&&&&& ThreadGroup parentT
&&&&&&&&& for (parentThread = Thread.currentThread().getThreadGroup(); parentThread
&&&&&&&&&&&&&&&&& .getParent() != parentThread = parentThread.getParent())
&&&&&&&&&&&&& ;
&&&&&&&&& int totalThread = parentThread.activeCount();
&&&&&&&&& double cpuRatio = 0;
&&&&&&&&& if (osName.toLowerCase().startsWith("windows")) {
&&&&&&&&&&&&& cpuRatio = this.getCpuRatioForWindows();
&&&&&&&&& }
&&&&&&&&& else {
&&&&&&&&&& cpuRatio = this.getCpuRateForLinux();
&&&&&&&&& }
&&&&&&&&&
&&&&&&&&& // 构造返回对象
&&&&&&&&& MonitorInfoBean infoBean = new MonitorInfoBean();
&&&&&&&&& infoBean.setFreeMemory(freeMemory);
&&&&&&&&& infoBean.setFreePhysicalMemorySize(freePhysicalMemorySize);
&&&&&&&&& infoBean.setMaxMemory(maxMemory);
&&&&&&&&& infoBean.setOsName(osName);
&&&&&&&&& infoBean.setTotalMemory(totalMemory);
&&&&&&&&& infoBean.setTotalMemorySize(totalMemorySize);
&&&&&&&&& infoBean.setTotalThread(totalThread);
&&&&&&&&& infoBean.setUsedMemory(usedMemory);
&&&&&&&&& infoBean.setCpuRatio(cpuRatio);
&&&&&&&&& return infoB
&&&&& }
&&&&& private static double getCpuRateForLinux(){
&&&&&&&&& InputStream is =
&&&&&&&&& InputStreamReader isr =
&&&&&&&&& BufferedReader brStat =
&&&&&&&&& StringTokenizer tokenStat =
&&&&&&&&& try{
&&&&&&&&&&&&& System.out.println("Get usage rate of CUP , linux version: "+linuxVersion);
&&&&&&&&&&&&& Process process = Runtime.getRuntime().exec("top -b -n 1");
&&&&&&&&&&&&& is = process.getInputStream();&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&& isr = new InputStreamReader(is);
&&&&&&&&&&&&& brStat = new BufferedReader(isr);
&&&&&&&&&&&&&
&&&&&&&&&&&&& if(linuxVersion.equals("2.4")){
&&&&&&&&&&&&&&&&& brStat.readLine();
&&&&&&&&&&&&&&&&& brStat.readLine();
&&&&&&&&&&&&&&&&& brStat.readLine();
&&&&&&&&&&&&&&&&& brStat.readLine();
&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&& tokenStat = new StringTokenizer(brStat.readLine());
&&&&&&&&&&&&&&&&& tokenStat.nextToken();
&&&&&&&&&&&&&&&&& tokenStat.nextToken();
&&&&&&&&&&&&&&&&& String user = tokenStat.nextToken();
&&&&&&&&&&&&&&&&& tokenStat.nextToken();
&&&&&&&&&&&&&&&&& String system = tokenStat.nextToken();
&&&&&&&&&&&&&&&&& tokenStat.nextToken();
&&&&&&&&&&&&&&&&& String nice = tokenStat.nextToken();
&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&& System.out.println(user+" , "+system+" , "+nice);
&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&& user = user.substring(0,user.indexOf("%"));
&&&&&&&&&&&&&&&&& system = system.substring(0,system.indexOf("%"));
&&&&&&&&&&&&&&&&& nice = nice.substring(0,nice.indexOf("%"));
&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&& float userUsage = new Float(user).floatValue();
&&&&&&&&&&&&&&&&& float systemUsage = new Float(system).floatValue();
&&&&&&&&&&&&&&&&& float niceUsage = new Float(nice).floatValue();
&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&& return (userUsage+systemUsage+niceUsage)/100;
&&&&&&&&&&&&& }else{
&&&&&&&&&&&&&&&&& brStat.readLine();
&&&&&&&&&&&&&&&&& brStat.readLine();
&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&& tokenStat = new StringTokenizer(brStat.readLine());
&&&&&&&&&&&&&&&&& tokenStat.nextToken();
&&&&&&&&&&&&&&&&& tokenStat.nextToken();
&&&&&&&&&&&&&&&&& tokenStat.nextToken();
&&&&&&&&&&&&&&&&& tokenStat.nextToken();
&&&&&&&&&&&&&&&&& tokenStat.nextToken();
&&&&&&&&&&&&&&&&& tokenStat.nextToken();
&&&&&&&&&&&&&&&&& tokenStat.nextToken();
&&&&&&&&&&&&&&&&& String cpuUsage = tokenStat.nextToken();
&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&& System.out.println("CPU idle : "+cpuUsage);
&&&&&&&&&&&&&&&&& Float usage = new Float(cpuUsage.substring(0,cpuUsage.indexOf("%")));
&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&& return (1-usage.floatValue()/100);
&&&&&&&&&&&&& }
&&&&&&&&&&&&&&
&&&&&&&&& } catch(IOException ioe){
&&&&&&&&&&&&& System.out.println(ioe.getMessage());
&&&&&&&&&&&&& freeResource(is, isr, brStat);
&&&&&&&&&&&&& return 1;
&&&&&&&&& } finally{
&&&&&&&&&&&&& freeResource(is, isr, brStat);
&&&&&&&&& }
&&&&& }
&&&&& private static void freeResource(InputStream is, InputStreamReader isr, BufferedReader br){
&&&&&&&&& try{
&&&&&&&&&&&&& if(is!=null)
&&&&&&&&&&&&&&&&& is.close();
&&&&&&&&&&&&& if(isr!=null)
&&&&&&&&&&&&&&&&& isr.close();
&&&&&&&&&&&&& if(br!=null)
&&&&&&&&&&&&&&&&& br.close();
&&&&&&&&& }catch(IOException ioe){
&&&&&&&&&&&&& System.out.println(ioe.getMessage());
&&&&&&&&& }
&&&&& }
&&&&&& * 获得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信息.
&&&&&& * @param proc
&&&&&& */
&&&&& private long[] readCpu(final Process proc) {
&&&&&&&&& long[] retn = new long[2];
&&&&&&&&& try {
&&&&&&&&&&&&& proc.getOutputStream().close();
&&&&&&&&&&&&& InputStreamReader ir = new InputStreamReader(proc.getInputStream());
&&&&&&&&&&&&& LineNumberReader input = new LineNumberReader(ir);
&&&&&&&&&&&&& String line = input.readLine();
&&&&&&&&&&&&& if (line == null || line.length() & FAULTLENGTH) {
&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&& }
&&&&&&&&&&&&& int capidx = line.indexOf("Caption");
&&&&&&&&&&&&& int cmdidx = line.indexOf("CommandLine");
&&&&&&&&&&&&& int rocidx = line.indexOf("ReadOperationCount");
&&&&&&&&&&&&& int umtidx = line.indexOf("UserModeTime");
&&&&&&&&&&&&& int kmtidx = line.indexOf("KernelModeTime");
&&&&&&&&&&&&& int wocidx = line.indexOf("WriteOperationCount");
&&&&&&&&&&&&& long idletime = 0;
&&&&&&&&&&&&& long kneltime = 0;
&&&&&&&&&&&&& long usertime = 0;
&&&&&&&&&&&&& while ((line = input.readLine()) != null) {
&&&&&&&&&&&&&&&&& if (line.length() & wocidx) {
&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&& // 字段出现顺序:Caption,CommandLine,KernelModeTime,ReadOperationCount,
&&&&&&&&&&&&&&&&& // ThreadCount,UserModeTime,WriteOperation
&&&&&&&&&&&&&&&&& String caption = Bytes.substring(line, capidx, cmdidx - 1)
&&&&&&&&&&&&&&&&&&&&&&&&& .trim();
&&&&&&&&&&&&&&&&& String cmd = Bytes.substring(line, cmdidx, kmtidx - 1).trim();
&&&&&&&&&&&&&&&&& if (cmd.indexOf("wmic.exe") &= 0) {
&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&& // log.info("line="+line);
&&&&&&&&&&&&&&&&& if (caption.equals("System Idle Process")
&&&&&&&&&&&&&&&&&&&&&&&&& || caption.equals("System")) {
&&&&&&&&&&&&&&&&&&&&& idletime += Long.valueOf(
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& Bytes.substring(line, kmtidx, rocidx - 1).trim())
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .longValue();
&&&&&&&&&&&&&&&&&&&&& idletime += Long.valueOf(
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& Bytes.substring(line, umtidx, wocidx - 1).trim())
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .longValue();
&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&& kneltime += Long.valueOf(
&&&&&&&&&&&&&&&&&&&&&&&&& Bytes.substring(line, kmtidx, rocidx - 1).trim())
&&&&&&&&&&&&&&&&&&&&&&&&& .longValue();
&&&&&&&&&&&&&&&&& usertime += Long.valueOf(
&&&&&&&&&&&&&&&&&&&&&&&&& Bytes.substring(line, umtidx, wocidx - 1).trim())
&&&&&&&&&&&&&&&&&&&&&&&&& .longValue();
&&&&&&&&&&&&& }
&&&&&&&&&&&&& retn[0] =
&&&&&&&&&&&&& retn[1] = kneltime +
&&&&&&&&&&&&&
&&&&&&&&& } catch (Exception ex) {
&&&&&&&&&&&&& ex.printStackTrace();
&&&&&&&&& } finally {
&&&&&&&&&&&&& try {
&&&&&&&&&&&&&&&&& proc.getInputStream().close();
&&&&&&&&&&&&& } catch (Exception e) {
&&&&&&&&&&&&&&&&& e.printStackTrace();
&&&&&&&&&&&&& }
&&&&&&&&& }
&&&&&&&&&
&&&&& }
&&&&&
&&&&& /**&&&& 测试方法.
&&&&&& * @param args
&&&&&& * @throws Exception
&&&&&&&& */
&&&&& public static void main(String[] args) throws Exception {
&&&&& cpu c =new cpu();
&&&&& System.out.println("cpu占有率1=" + c.getCpuRatio());
&&&&& System.out.println("cpu占有率2=" + c.getCpuRatioForWindows());
&&&&&&&&& MonitorInfoBean monitorInfo = c.getMonitorInfoBean();
&&&&&&&&& System.out.println("cpu占有率=" + monitorInfo.getCpuRatio());
&&&&&&&&&
&&&&&&&&& System.out.println("可使用内存=" + monitorInfo.getTotalMemory());
&&&&&&&&& System.out.println("剩余内存=" + monitorInfo.getFreeMemory());
&&&&&&&&& System.out.println("最大可使用内存=" + monitorInfo.getMaxMemory());
&&&&&&&&&
&&&&&&&&& System.out.println("操作系统=" + monitorInfo.getOsName());
&&&&&&&&& System.out.println("总的物理内存=" + monitorInfo.getTotalMemorySize() + "kb");
&&&&&&&&& System.out.println("剩余的物理内存=" + monitorInfo.getFreeMemory() + "kb");
&&&&&&&&& System.out.println("已使用的物理内存=" + monitorInfo.getUsedMemory() + "kb");
&&&&&&&&& System.out.println("线程总数=" + monitorInfo.getTotalThread() + "kb");
&&&&& }
}
class Bytes {
&&& public static String substring(String src, int start_idx, int end_idx){
&&&&&&& byte[] b = src.getBytes();
&&&&&&& String tgt = "";
&&&&&&& for(int i=start_ i&=end_ i++){
&&&&&&&&&&& tgt +=(char)b[i];
&&&&&&& }
&&&&&&&
&&& }
}
该文章转自:
xiaoyu123456
浏览: 2668 次
来自: 济南
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'

我要回帖

更多关于 监控cpu 内存使用情况 的文章

 

随机推荐