当前位置:编程学习 > JAVA >>

利用 Runtime 监控 Java 系统资源

这些日子要用爪哇语言(Java)做内存数据中心。于是把用 Java 监控运行环境硬件资源的内容复习了一下。爪哇类库提供了 java.util.Runtim 类,主要负责调用爪哇虚拟机(JavaVM)外部的基层操作系统功能、处理基于一种叫钩子的原理的程序、获取系统资源信息以及控制调试信息生成。本文单独利用其获取系统资源信息的功能。

java.util.Runtim 类具有以下几个方法和获取系统资源信息有关。以下代码可不是简简单单从标准类库里边复制出来的哦。全球目前独此一份。
[java
/**
 * 返回爪哇(Java)虚拟机可用线程数。
 *
 * <p>该值在特定的虚拟机调用期间可能发生更改。因此,对可用处理器数目很敏感的
 * 应用程序应该不定期地轮询该属性,并相应地调整其资源用法。</p>
 *
 * @return  虚拟机可用的最大处理器数目;从不小于 1
 * @since 1.4
 */ 
public native int availableProcessors(); 
 
/**
 * 返回爪哇(Java)虚拟机中的空闲内存量。调用 <code>gc</code> 方法可能导致
 * <code>freeMemory</code> 返回值的增加。
 *
 * @return  供将来分配对象使用的当前可用内存的近似总量,以字节为单位。
 */ 
public native long freeMemory(); 
 
/**
 * 返回爪哇(Java)虚拟机中的内存总量。此方法返回的值可能随时间的推移而变化,这
 * 取决于主机环境。
 * <p>
 * 注意,保存一个给定类型的对象所需的内存量可能取决于实现方式。
 *
 * @return  目前为当前和后续对象提供的内存总量,以字节为单位。
 */ 
public native long totalMemory();           //                                // 
 
/**
 * 返回爪哇(Java)虚拟机能够尝试使用的最大内存量。如果内存本身没有限制,则
 * 返回值 {@link java.lang.Long#MAX_VALUE} 。 </p>
 *
 * @return  虚拟机能够尝试使用的最大内存量,以字节为单位。
 * @since 1.4
 */ 
public native long maxMemory(); 
 
/**
 * 运行垃圾回收器。
 * 调用此方法意味着爪哇(Java)虚拟机做了一些努力来回收未用对象,以便能够快速地
 * 重用这些对象当前占用的内存。当控制从方法调用中返回时,虚拟机已经尽最大努力回收
 * 了所有丢弃的对象。
 * <p>
 * 名称 <code>gc</code> 代表“垃圾回收器”。虚拟机根据需要在单独的线程中自动执行
 * 回收过程,甚至不用显式调用 <code>gc</code> 方法。
 * <p>
 * 方法 {@link System#gc()} 是调用此方法的一种传统而便捷的方式
 */ 
public native void gc(); 

我们可以看到这些都是本地方法。这意味着将 Runtime 对象远程传递之后,将不能得到正确执行结果。
这些方法用起来都很简单,文档注释也写得比较明白。
在高可用数据中心中,我认为应该根据可用 CPU 线数决定程序开启的线程数。此线程数为 CPU 可用线数的某倍数。此倍数应通过实际经验所得。然后程序通过监控 CPU 可用线数,来控制线程池保留数量。
内存的控制,我想应该是在内存超出警戒线时发出警报,以向运营人员申请增加内存数据中心服务器。同时,应该在内存过满之前,由程序执行垃圾回收,以消除并无引用的老生代对象。
如果各位有对内存数据中心的想法、建议或者质疑,欢迎来一起讨论。

下边是我编写的一个系统资源测试程序。程序里边使用了 Runtime 类关于系统资源的所有方法。
[java] 
package cn.spads.test.grammar; 
 
import java.util.LinkedList; 
import java.util.Random; 
 
/**
 * 本类用于示范使用 Runtime 检查系统运行情况。
 * 将 Runtime 作为可变成员,是为多系统公用检查预留的设计。
 * @author  Shane Loo Li
 */ 
public class PerformanceMonitor 

    /**
     * 此量控制程序运行时间。此值越大,此演示程序运行时间越长。
     */ 
    static public int runLoopTimes = 55; 
 
    /**
     * 此为每次检测间隔的时间片数。此值越大,间隔时间越长。
     */ 
    static public int waitTime = 1500000; 
 
    static public void main(String[] arguments) throws Exception 
    { 
        Runtime context = Runtime.getRuntime(); 
        final PerformanceMonitor monitor = new PerformanceMonitor(context); 
        final LinkedList<String> pretendedMemory = new LinkedList<String>(); 
        new Thread( 
                new Runnable() 
                { 
                    public void run() 
                    { 
                        for (int j = -1; ++j != runLoopTimes; ) 
                        { 
                            // 检查系统情况 
                            monitor.checkAll(); 
 
                            // 每次检查运行情况之后,都会休息 1000 个时间片 
                            for (int i = -1; ++i != waitTime; ) Thread.yield(); 
 
                            // 每次检查之后,会制造一些对象,记录其中一部分,并删除些老对象 
                            for (int i = -1; ++i != 20000; ) 
                            { 
                                StringBuilder builder = new StringBuilder(); 
                                Random ran = new Random(); 
                                for

补充:软件开发 , Java ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,