在工作中,有时候需要实时去监控内存的使用情况,当然监控java的jvm内存的方法有很多,比如:sun的jdk版本1.5和1.6之后中就带了很多这样的工具,jstat,jps,jstatd,jmap,jinfo,jconsole等一系列,这些工具基本已经能很好的去完成jvm内存,线程等监控工作。
我们现在不需要做这么麻烦的,因为我们只是需要监控项目系统内存的监控,这时候就可以用到java.lang.Runtime。。每个java应用程序都有一个runtime类实例,使应用程序能和运行环境相链接,可以通过getRuntime方法获取当前运行对象,应用程序不能创建自己的 Runtime 类实例。runtime实例对象有且仅有一个Runtime类对象,因为Runtime()方法是单利模式(饿汉模式)进行设计的。
下来我们来看看Runtime类中提供的一些方法:
void |
addShutdownHook(Thread hook) |
int |
availableProcessors() |
Process |
exec(String command) |
Process |
exec(String[] cmdarray) |
Process |
exec(String[] cmdarray, String[] envp) |
Process |
exec(String[] cmdarray, String[] envp, File dir) |
Process |
exec(String command, String[] envp) |
Process |
exec(String command, String[] envp, File dir) |
void |
exit(int status) |
long |
freeMemory() |
void |
gc() |
InputStream |
getLocalizedInputStream(InputStream in) |
OutputStream |
getLocalizedOutputStream(OutputStream out) |
static Runtime |
getRuntime() |
void |
halt(int status) |
void |
load(String filename) |
void |
loadLibrary(String libname) |
long |
maxMemory() |
boolean |
removeShutdownHook(Thread hook) |
void |
runFinalization() |
static void |
runFinalizersOnExit(boolean value) |
long |
totalMemory() |
void |
traceInstructions(boolean on) |
void |
traceMethodCalls(boolean on) |
以上方法来自于Runtime类api文档,因为Runtime继承类java.lang.Object,因此也继承了Object类的一些方法:clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait。
我们现在需要做内存监控暂时不需要全部去了解Runtime类的方法,只需要去看表格中“蓝色”标记的方法。
public static Runtime getRuntime(){
Return currentRuntime;
}
返回与当前 Java 应用程序相关的运行时对象。Runtime类的大多数方法是实例方法,并且必须根据当前的运行时对象对其进行调用。
返回:
与当前 Java 应用程序相关的 Runtime 对象。
public native long totalMemory();
返回 Java 虚拟机中的内存总量。此方法返回的值可能随时间的推移而变化,这取决于主机环境。
注意,保存任意给定类型的一个对象所需的内存量可能取决于实现方法。
返回:
目前为当前和后续对象提供的内存总量,以字节为单位。
public native long maxMemory();
返回 Java 虚拟机试图使用的最大内存量。如果内存本身没有限制,则返回值 Long.MAX_VALUE。
返回:
虚拟机试图使用的最大内存量,以字节为单位。
public native void gc();
运行垃圾回收器。调用此方法意味着 Java 虚拟机做了一些努力来回收未用对象,以便能够快速地重用这些对象当前占用的内存。当控制从方法调用中返回时,虚拟机已经尽最大努力回收了所有丢弃的对象。
名称 gc 代表“垃圾回收器”。虚拟机根据需要在单独的线程中自动执行回收过程,甚至不用显式调用 gc 方法。
方法 System.gc() 是调用此方法的一种传统而便捷的方式。
当我们了解了以上方法时,就可以动手去实现我们自己的功能了。
//当前JVM占用的内存总数(M)
double total = (Runtime.getRuntime().totalMemory()) / (1024.0 * 1024);
//JVM最大可用内存总数(M)
double max = (Runtime.getRuntime().maxMemory()) / (1024.0 * 1024);
//JVM空闲内存(M)
double free = (Runtime.getRuntime().freeMemory()) / (1024.0 * 1024);
//可用内存内存(M)
double mayuse=(max - total + free);
//已经使用内存(M)
double used=(total-free);