使用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利用率等信息。

PS:得到局域网内所有主机名的方法

import java.net.InetAddress;
import java.net.UnknownHostException;
public class A { 

 static public void main(String[] args) {
 try {
   //通过主机名称得到IP地址
  InetAddress address = InetAddress.getByName("192.168.9.148");
  System.out.println("192.168.9.148"+": "+address.getHostAddress());
//  通过IP得到主机名称
  String ips="192.168.9.",ip;
  InetAddress addip;
    for(int i=148;i<255;i++){
    ip=ips+i;
    addip=InetAddress.getByName(ip);
     System.out.println(ip+": "+addip.getHostName());

    }

  }
  catch(UnknownHostException uhe) {
  System.err.println("Unable to find: "+"192.168.9.148");
  }
 }
 }
(0)

相关推荐

  • java开发中如何使用JVisualVM进行性能分析

    JVisualVM是由Sun提供的性能分析工具,如此强大的后盾怎能不强大?在Jdk6.0以后的版本中是自带的,配置好环境变量然后在运行中输入"JVisualVm"或直接到Jdk的安装目录的Bin目录下找到运行程序即可运行.如果是用Jdk1.5或以前版本的朋友就得要单独安装了. 我觉得其还有一个强大的地方就是不需要用代理启动(即如果要监视某个程序则需要用测试软件来运行程序方便其监视如YourKit这款同类的测试工具)的方式来运行,十分方便,只要是用Jdk环境运行的,打开此测试工具后即能看

  • Java中Map的遍历方法及性能测试

    1. 阐述 对于Java中Map的遍历方式,很多文章都推荐使用entrySet,认为其比keySet的效率高很多.理由是:entrySet方法一次拿到所有key和value的集合:而keySet拿到的只是key的集合,针对每个key,都要去Map中额外查找一次value,从而降低了总体效率.那么实际情况如何呢? 为了解遍历性能的真实差距,包括在遍历key+value.遍历key.遍历value等不同场景下的差异,我试着进行了一些对比测试. 2. 对比测试 一开始只进行了简单的测试,但结果却表明k

  • JAVA LinkedList和ArrayList的使用及性能分析

    第1部分 List概括List的框架图List 是一个接口,它继承于Collection的接口.它代表着有序的队列.AbstractList 是一个抽象类,它继承于AbstractCollection.AbstractList实现List接口中除size().get(int location)之外的函数.AbstractSequentialList 是一个抽象类,它继承于AbstractList.AbstractSequentialList 实现了"链表中,根据index索引值操作链表的全部函数

  • Java虚拟机JVM性能优化(三):垃圾收集详解

    Java平台的垃圾收集机制显著提高了开发者的效率,但是一个实现糟糕的垃圾收集器可能过多地消耗应用程序的资源.在Java虚拟机性能优化系列的第三部分,Eva Andreasson向Java初学者介绍了Java平台的内存模型和垃圾收集机制.她解释了为什么碎片化(而不是垃圾收集)是Java应用程序性能的主要问题所在,以及为什么分代垃圾收集和压缩是目前处理Java应用程序碎片化的主要办法(但不是最有新意的). 垃圾收集(GC)的目的是释放那些不再被任何活动对象引用的Java对象所占用的内存,它是Java

  • java字符串拼接与性能分析详解

    假设有一个字符串,我们将对这个字符串做大量循环拼接操作,使用"+"的话将得到最低的性能.但是究竟这个性能有多差?如果我们同时也把StringBuffer,StringBuilder或String.concat()放入性能测试中,结果又会如何呢?本文将会就这些问题给出一个答案! 我们将使用Per4j来计算性能,因为这个工具可以给我们一个完整的性能指标集合,比如最小,最大耗时,统计时间段的标准偏差等.在测试代码中,为了得到一个准确的标准偏差值,我们将执行20个拼接"*"

  • Java性能调优概述

    程序性能的主要表现点: 执行速度:程序的反映是否迅速,响应时间是否足够短 内存分配:内存分配是否合理,是否过多地消耗内存或者存在内存泄漏 启动时间:程序从运行到可以正常处理业务需要花费多少时间 负载承受能力:当系统压力上升时,系统的执行速度.响应时间的上升曲线是否平缓 衡量程序性能的主要指标: 执行时间:程序从运行到结束所使用的时间 CPU时间:函数或者线程占用CPU的时间 内存分配:程序在运行时占用内容的空间 磁盘吞吐量:描述I/O的使用情况 网络吞吐量:描述网络的使用情况 响应时间:系统对用

  • Java虚拟机JVM性能优化(一):JVM知识总结

    Java应用程序是运行在JVM上的,但是你对JVM技术了解吗?这篇文章(这个系列的第一部分)讲述了经典Java虚拟机是怎么样工作的,例如:Java一次编写的利弊,跨平台引擎,垃圾回收基础知识,经典的GC算法和编译优化.之后的文章会讲JVM性能优化,包括最新的JVM设计--支持当今高并发Java应用的性能和扩展. 如果你是一个开发人员,你肯定遇到过这样的特殊感觉,你突然灵光一现,所有的思路连接起来了,你能以一个新的视角来回想起你以前的想法.我个人很喜欢学习新知识带来的这种感觉.我已经有过很多次这样

  • Java并发编程之性能、扩展性和响应

    本文讨论的重点在于多线程应用程序的性能问题.我们会先给性能和扩展性下一个定义,然后再仔细学习一下Amdahl法则.下面的内容我们会考察一下如何用不同的技术方法来减少锁竞争,以及如何用代码来实现. 1.性能 我们都知道,多线程可以用来提高程序的性能,背后的原因在于我们有多核的CPU或多个CPU.每个CPU的内核都可以自己完成任务,因此把一个大的任务分解成一系列的可彼此独立运行的小任务就可以提高程序的整体性能了.可以举个例子,比如有个程序用来将硬盘上某个文件夹下的所有图片的尺寸进行修改,应用多线程技

  • 分享几个提高Java性能的高效用法

    1.在重要的循环里,消除循环终止判断时的方法调用 复制代码 代码如下: for(int i=0; i<collection.size(); i++) { ... } for(int i=0; i<collection.size(); i++) { ... } 替换为- 复制代码 代码如下: view plaincopy to clipboardprint? for(int i=0;n=collection.size();i<n;i++) { ... } 2.通常,把与循环index不相关

  • 浅谈JAVA 异常对于性能的影响

    在对客户做技术支持时,我们常常会看到很多客户根本没意识到的异常.在消除了这些异常之后,代码运行速度与以前相比大幅提升.这让我们产生一种猜测,就是在代码里面使用异常会带来显著的性能开销.因为异常是错误情况处理的重要组成部分,摒弃是不太可能的,所以我们需要衡量异常处理对于性能影响,我们可以通过一个实验看看异常处理的对于性能的影响. 实验 我的实验基于一段随机抛出异常的简单代码.从科学的角度,这并非完全准确的测量,同时我也并不了解HotSpot 编译器会对运行中的代码做何动作.但无论如何,这段代码应该

  • Java遍历集合方法分析(实现原理、算法性能、适用场合)

    概述 Java语言中,提供了一套数据集合框架,其中定义了一些诸如List.Set等抽象数据类型,每个抽象数据类型的各个具体实现,底层又采用了不同的实现方式,比如ArrayList和LinkedList. 除此之外,Java对于数据集合的遍历,也提供了几种不同的方式.开发人员必须要清楚的明白每一种遍历方式的特点.适用场合.以及在不同底层实现上的表现.下面就详细分析一下这一块内容. 数据元素是怎样在内存中存放的? 数据元素在内存中,主要有2种存储方式: 1.顺序存储,Random Access(Di

随机推荐