- 浏览: 445016 次
- 性别:
- 来自: 苏州
文章分类
最新评论
-
danStart:
想问问,能监测服务是否挂掉吗?
公司要求实时监控服务器,写个Web的监控系统 -
hepct:
你好,最近在搭一个游戏服务器,能加好友请教下吗?1538863 ...
java游戏服务端实现 -
Limewwy:
没打完就发表了?为啥要这样设置?【游戏中需要传递用户的积分,这 ...
java游戏服务端实现 -
Limewwy:
楼主您好。请教为啥要这样设计?
java游戏服务端实现 -
3849801:
楼主,能够提供更具体的文档或者指导吗?我想搭建一个服务端,非常 ...
java游戏服务端实现
最近做个项目,就是要取得cpu占有率等等的系统信息,一开始以为要用动态链接库了,但后来发现可以像下面这样做,不去调用jni,这样省去了很多看新技术的时间o(∩_∩)o...
在Java中,可以获得总的物理内存、剩余的物理内存、已使用的物理内存等信息,下面例子可以取得这些信息,并且获得在Windows下的内存使用率。
首先编写一个MonitorInfoBean类,用来装载监控的一些信息,包括物理内存、剩余的物理内存、已使用的物理内存、内存使用率等字段,该类的代码如下:
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; } }
接着编写一个获得当前的监控信息的接口,该类的代码如下所示:
package com.amgkaka.performance; /** *//** * 获取系统信息的业务逻辑类接口. * @author amg * @version 1.0 * Creation date: 2008-3-11 - 上午10:06:06 */ public interface IMonitorService { /** *//** * 获得当前的监控对象. * @return 返回构造好的监控对象 * @throws Exception * @author amgkaka * Creation date: 2008-4-25 - 上午10:45:08 */ public MonitorInfoBean getMonitorInfoBean() throws Exception; }
该类的实现类MonitorServiceImpl如下所示:
package com.amgkaka.performance; import java.io.InputStreamReader; import java.io.LineNumberReader; import sun.management.ManagementFactory; import com.sun.management.OperatingSystemMXBean; /** *//** * 获取系统信息的业务逻辑实现类. * @author amg * @version 1.0 Creation date: 2008-3-11 - 上午10:06:06 */ public class MonitorServiceImpl implements IMonitorService { //可以设置长些,防止读到运行此次系统检查时的cpu占用率,就不准了 private static final int CPUTIME = 5000; private static final int PERCENT = 100; private static final int FAULTLENGTH = 10; /** *//** * 获得当前的监控对象. * @return 返回构造好的监控对象 * @throws Exception * @author amg * Creation date: 2008-4-25 - 上午10:45:08 */ public MonitorInfoBean getMonitorInfoBean() throws Exception { int kb = 1024; // 可使用内存 long totalMemory = Runtime.getRuntime().totalMemory() / kb; // 剩余内存 long freeMemory = Runtime.getRuntime().freeMemory() / kb; // 最大可使用内存 long maxMemory = Runtime.getRuntime().maxMemory() / kb; OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ManagementFactory .getOperatingSystemMXBean(); // 操作系统 String osName = System.getProperty("os.name"); // 总的物理内存 long totalMemorySize = osmxb.getTotalPhysicalMemorySize() / kb; // 剩余的物理内存 long freePhysicalMemorySize = osmxb.getFreePhysicalMemorySize() / kb; // 已使用的物理内存 long usedMemory = (osmxb.getTotalPhysicalMemorySize() - osmxb .getFreePhysicalMemorySize()) / kb; // 获得线程总数 ThreadGroup parentThread; for (parentThread = Thread.currentThread().getThreadGroup(); parentThread .getParent() != null; parentThread = parentThread.getParent()) ; int totalThread = parentThread.activeCount(); double cpuRatio = 0; if (osName.toLowerCase().startsWith("windows")) { cpuRatio = this.getCpuRatioForWindows(); } // 构造返回对象 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 infoBean; } /** *//** * 获得CPU使用率. * @return 返回cpu使用率 * @author amg * Creation date: 2008-4-25 - 下午06:05:11 */ 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 * @return * @author amg * Creation date: 2008-4-25 - 下午06:10:14 */ 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) { return null; } 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) { continue; } // 字段出现顺序: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) { continue; } // 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(); continue; } kneltime += Long.valueOf( Bytes.substring(line, kmtidx, rocidx - 1).trim()) .longValue(); usertime += Long.valueOf( Bytes.substring(line, umtidx, wocidx - 1).trim()) .longValue(); } retn[0] = idletime; retn[1] = kneltime + usertime; return retn; } catch (Exception ex) { ex.printStackTrace(); } finally { try { proc.getInputStream().close(); } catch (Exception e) { e.printStackTrace(); } } return null; } /** *//** * 测试方法. * @param args * @throws Exception * @author amg * Creation date: 2008-4-30 - 下午04:47:29 */ public static void main(String[] args) throws Exception { IMonitorService service = new MonitorServiceImpl(); MonitorInfoBean monitorInfo = service.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"); } }
该实现类中需要用到一个自己编写byte的工具类,该类的代码如下所示:
package com.amgkaka.performance; /** *//** * byte操作类. * @author amg * @version 1.0 * Creation date: 2008-4-30 - 下午04:57:23 */ public class Bytes { /** *//** * 由于String.subString对汉字处理存在问题(把一个汉字视为一个字节),因此在 * 包含汉字的字符串时存在隐患,现调整如下: * @param src 要截取的字符串 * @param start_idx 开始坐标(包括该坐标) * @param end_idx 截止坐标(包括该坐标) * @return */ public static String substring(String src, int start_idx, int end_idx){ byte[] b = src.getBytes(); String tgt = ""; for(int i=start_idx; i<=end_idx; i++){ tgt +=(char)b[i]; } return tgt; } }
运行下MonitorBeanImpl类,读者将会看到当前的内存、cpu利用率等信息。
评论
12 楼
public_private
2013-12-19
你这也太费劲了点吧。
11 楼
OpenMind
2012-02-14
可以去翻jconsole的源码,里面有关于监控jvm的一切操作
10 楼
kakaluyi
2011-12-30
jifeng305 写道
楼主我想知道如何远程看别的IP地址的机器的这些信息怎么搞?
别的ip地址肯定需要某种访问方式,要不然socket去远程机器拿,要不然远程机器把数据推给本地(推到数据库,推到本机的webservice,或者推给本地的socket监听端口),
9 楼
jifeng305
2011-12-30
楼主我想知道如何远程看别的IP地址的机器的这些信息怎么搞?
8 楼
zwfflying
2011-06-28
这个方法性能很差,去后台查一下要2-3秒钟,反应到前台的话就会卡死。
7 楼
kakaluyi
2011-06-03
Linux的实现方法我过两天会更新上去
6 楼
ynpanhong
2011-05-19
只能取windows下面的信息吧,其它的系统可以吗?如:unix
5 楼
chenyongxin
2010-12-21
mark
4 楼
kakaluyi
2008-07-22
是啊要用到jni所以。。郁闷啊
3 楼
youjianbo_han_87
2008-07-17
楼主,获取这个信息很简单好不好,你不过做了个java版的任务管理器,一般都是想获得cpu或者网卡等硬件的序列号等信息,java还是不行
2 楼
kakaluyi
2008-07-04
现在又有需求了要查看cpu温度,那怎么做呢,请教各位大牛!!
1 楼
ialy_2000
2008-07-04
发表评论
-
ant使用小结
2014-04-01 13:12 3310Java代码 1. <prope ... -
模拟登录
2011-10-21 16:25 1878public class QQ { public stati ... -
在线查询使用常用API
2011-09-13 13:30 1390转载 收集了一些常用的API参考文档,放在这里以备及时 ... -
在linux中执行平台相关runtime.exec()
2011-03-23 15:46 2168/* * @(#) Exec.java Feb 28, 201 ... -
Finalize 和 GC的区别
2011-02-16 10:38 1250finalize()是由JVM自动调用的,你可以用System ... -
转:ThreadLocal示例
2010-09-09 09:00 1373本文借花献佛,引用Ti ... -
利用Tomcat7.0新特性,用BS实现CS的聊天服务器
2010-07-03 15:29 3508Tomcat7.0.0已经出来了,关注它已经支持se ... -
java加密解密
2010-04-16 11:29 1770转载:http://blog.csdn.net/xwchen/ ... -
优化MyEclipse
2010-01-04 14:23 1301“工欲善其事必先利其 ... -
html放入一个String中,将每行<td class = "b"></td>中的值读出
2009-04-09 17:33 2722我现在有一个网页。 <html> <body ... -
编写高效的线程安全类
2009-03-24 11:22 952文档选项 ... -
Struts中Token的使用方法
2008-11-25 16:11 4680Token的使用方法使用Token可以防止当用 ... -
一个基于Java和ajax得Web层聊天室
2008-10-11 17:22 4300一个基于Java和Ajax的聊 ... -
J2EE开发之常用开源项目介绍
2008-08-06 19:49 1097J2EE开发之常用开源项目介绍 主要就我所了解的J2EE开 ... -
获得来访IP
2008-07-30 15:54 1531public static String ge ... -
Java发送Html请求,并解析返回的请求
2008-07-10 11:00 9516今天是2008年7月7日星期一,下午一直在学校做个人开始页面。 ... -
编写对gc友好,又不泄露的代码
2008-07-10 09:59 1154作者:江南白衣,最新版链接:http://blog.csdn. ... -
java.util.Collections.sort(List list)与Comparable,
2008-07-09 17:31 4921java.util.Collections.sort(List ... -
在struts中使用checkbox实现批量删除
2008-04-30 11:32 4662<html:form StyleId = "d ... -
HttpURLConnection中获得重定向的地址 (转)
2008-04-22 09:35 10957HttpURLConnection使用中的一个问题,就是当连接 ...
相关推荐
在《Java_JNI_获得系统进程信息实例.doc》中,我们探索了一个利用Java Native Interface (JNI)来获取操作系统进程信息的示例项目。该项目由三个主要部分组成:`systemProcess.java`,`dataProcess.java`以及`process...
JNI最常用于实现Java环境下的底层功能访问,特别是那些需要高性能或者依赖特定操作系统或硬件的功能。通过JNI,开发者可以编写Java应用程序来调用本地方法,这些本地方法通常是用C或C++编写的,并被编译成动态链接库...
在 Java 中,JNI 可以帮助我们获取操作系统级别的内存信息,例如总内存、已用内存和空闲内存。在 Windows 上,可以使用 `GlobalMemoryStatusEx` 函数;在 Unix 系统中,可以读取 `/proc/meminfo` 文件。 4. **网卡...
6. 异常处理:在JNI中,使用`ExceptionOccurred`检查是否发生了异常,如果有,可以用`ExceptionDescribe`打印异常信息,`ExceptionClear`清除当前的异常。 7. 类和方法ID:在C/C++中,你需要先获取类的`jclass`,...
为了实现这一目标,我们可以利用JNI(Java Native Interface),它提供了一种方式让Java代码能够调用C/C++编写的本地方法,从而获取系统底层的信息。本文将详细讲解如何通过JNI在Java中获取CPU和内存的使用率。 ...
### Java的JNI本地调用详解 #### 一、简述JNI技术 ...虽然使用JNI可以带来诸多好处,但也需注意它可能导致的问题,比如增加代码复杂度、降低程序的可移植性等。因此,在实际开发中应根据需求权衡是否使用JNI。
JNI提供了一种方式,让Java代码可以调用C/C++编写的本地方法,同时也允许C/C++代码调用Java对象的方法。通过定义`native`关键字的函数,Java类可以在运行时通过`System.loadLibrary()`加载对应的本地库,从而实现跨...
在Android开发中,JNI常用于提升性能、调用系统库或者实现特定功能,如与C/C++库交互。本项目重点在于如何在JNI中利用多线程调用Java代码,这在处理大量数据或者并发任务时非常有用。 首先,理解JNI的基本概念至关...
通过JNI,开发者可以在Java应用程序中利用已有的C++库,提升性能或实现Java无法直接处理的功能。 【配置JNI开发环境】 1. **安装JDK**:首先确保安装了Java Development Kit(JDK),推荐使用1.5及以上版本。安装...
本地代码可以通过`ExceptionOccurred`检查是否有Java异常发生,使用`ExceptionDescribe`打印异常信息,`ExceptionClear`清除当前的异常。 8. **线程支持** JNI支持多线程编程,每个Java线程都有一个对应的本地线程...
在Java编程中,获取系统资源的信息是常见...总的来说,Java虽然不能直接提供获取所有系统资源的通用方法,但通过标准库和其他辅助工具,我们可以获取到CPU、内存和硬盘等关键信息,为系统监控和性能优化提供数据支持。
总结来说,获取当前系统所有进程可以通过Java直接调用操作系统命令或者使用JNI调用本地代码实现。前者简单且跨平台,但可能受到操作系统命令行工具的限制;后者更灵活,可以直接操作底层系统,但需要编写和管理本地...
这些信息可以通过Runtime类的exec方法执行,并通过BufferedReader读取输出流。 在Mac OS环境中,Java可以利用OS X提供的命令行工具,如`sysctl`和`system_profiler`。`sysctl`命令可以获取内核和硬件参数,而`...
它不仅能够帮助开发者整合现有的C/C++代码库,还能让Java应用与本地系统更好地交互,从而获得更好的性能或者访问特定硬件资源的能力。 #### 二、JNI的应用场景 JNI的应用场景非常广泛,主要可以分为以下几个方面:...
在这个例子中,`JNI_OnLoad()`函数首先获取当前的JNIEnv指针,并检查是否支持所需的JNI版本(这里假设是1.4版本)。然后,它会注册多个Java native方法,确保这些方法能够在Java层被正确调用。如果注册过程中出现...
"Java 读取任务管理器信息" 本文主要讨论了如何在 Java 中读取任务管理器信息,包括物理内存、剩余物理内存、已使用...java 中读取任务管理器信息可以帮助开发者更好地了解系统的当前状态,提高系统的性能和可维护性。
JNI(Java Native Interface)是Java平台的标准组成部分,它允许Java代码和...通过JNI,我们可以轻松地集成现有C/C++库,实现高性能计算,或者访问特定操作系统的功能。理解并熟练使用JNI是任何Java开发者的宝贵技能。
这些方法返回的信息可以帮助我们了解设备当前连接的运营商和网络环境。 接下来,关于JNI,它是Java平台用来与C/C++原生代码交互的一种机制。在某些情况下,为了提高性能或者利用硬件特性,开发者可能需要编写原生...