Runtime监控项目内存使用情况

在工作中,有时候需要实时去监控内存的使用情况,当然监控javajvm内存的方法有很多,比如:sunjdk版本1.51.6之后中就带了很多这样的工具,jstatjpsjstatdjmapjinfojconsole等一系列,这些工具基本已经能很好的去完成jvm内存,线程等监控工作。

我们现在不需要做这么麻烦的,因为我们只是需要监控项目系统内存的监控,这时候就可以用到java.lang.Runtime。。每个java应用程序都有一个runtime类实例,使应用程序能和运行环境相链接,可以通过getRuntime方法获取当前运行对象,应用程序不能创建自己的 Runtime 类实例。runtime实例对象有且仅有一个Runtime类对象,因为Runtime()方法是单利模式(饿汉模式)进行设计的。

下来我们来看看Runtime类中提供的一些方法:

 void

addShutdownHook(Thread hook) 
          注册新的虚拟机来关闭钩子。

 int

availableProcessors() 
          向 Java 虚拟机返回可用处理器的数目。

 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) 
          通过启动虚拟机的关闭序列,终止当前正在运行的 Java 虚拟机。

 long

freeMemory() 
          返回 Java 虚拟机中的空闲内存量。

 void

gc() 
          运行垃圾回收器。

 InputStream

getLocalizedInputStream(InputStream in) 
          已过时。 从 JDK 1.1 开始,将本地编码字节流转换为 Unicode 字符流的首选方法是使用 InputStreamReader  BufferedReader 类。

 OutputStream

getLocalizedOutputStream(OutputStream out) 
          已过时。 从 JDK 1.1 开始,将 Unicode 字符流转换为本地编码字节流的首选方法是使用 OutputStreamWriter、BufferedWriter  PrintWriter 类。

static Runtime

getRuntime() 
          返回与当前 Java 应用程序相关的运行时对象。

 void

halt(int status) 
          强行终止目前正在运行的 Java 虚拟机。

 void

load(String filename) 
          加载作为动态库的指定文件名。

 void

loadLibrary(String libname) 
          加载具有指定库名的动态库。

 long

maxMemory() 
          返回 Java 虚拟机试图使用的最大内存量。

 boolean

removeShutdownHook(Thread hook) 
          取消注册某个先前已注册的虚拟机关闭钩子。

 void

runFinalization() 
          运行挂起 finalization 的所有对象的终止方法。

static void

runFinalizersOnExit(boolean value) 
          已过时。 此方法本身具有不安全性。它可能对正在使用的对象调用终结方法,而其他线程正在操作这些对象,从而导致不正确的行为或死锁。

 long

totalMemory() 
          返回 Java 虚拟机中的内存总量。

 void

traceInstructions(boolean on) 
          启用/禁用指令跟踪。

 void

traceMethodCalls(boolean on) 
          启用/禁用方法调用跟踪。

以上方法来自于Runtimeapi文档,因为Runtime继承类java.lang.Object,因此也继承了Object类的一些方法:clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait

我们现在需要做内存监控暂时不需要全部去了解Runtime类的方法,只需要去看表格中“蓝色”标记的方法。

 

getRuntime

public static Runtime getRuntime(){

    Return currentRuntime;

}

返回与当前 Java 应用程序相关的运行时对象。Runtime类的大多数方法是实例方法,并且必须根据当前的运行时对象对其进行调用。

返回:

与当前 Java 应用程序相关的 Runtime 对象。

 

totalMemory

public native long totalMemory();

返回 Java 虚拟机中的内存总量。此方法返回的值可能随时间的推移而变化,这取决于主机环境。

注意,保存任意给定类型的一个对象所需的内存量可能取决于实现方法。

返回:

目前为当前和后续对象提供的内存总量,以字节为单位。

 

maxMemory

public native long maxMemory();

返回 Java 虚拟机试图使用的最大内存量。如果内存本身没有限制,则返回值 Long.MAX_VALUE。

返回:

虚拟机试图使用的最大内存量,以字节为单位。

 

gc

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);

 

 

 

你可能感兴趣的:(java)