Runtime简介
当程序运行时,每个java应用程序都能得到一个运行时的实例,应用程序不能创建这个实例,只能从getRuntime()方法获得RunTime实例。
1. RunTime是单例模式,不能实例化
private static Runtime currentRuntime = new Runtime();
public static Runtime getRuntime() {
return currentRuntime;
}
private Runtime() {}
我们看到源码是单例模式实例(饿汉式,线程安全 但效率比较低 ),设计成单例主要是从节约系统资源来考虑。
2. Runtime几个核心方法
-
exec("notepad");
在单独的进程中执行指定的字符串命令。
- exec("notepad","demo");
在单独的进程中执行指定命令和变量。
availableProcessors();
向 Java 虚拟机返回可用处理器的数目。
int num = Runtime.getRuntime().availableProcessors();
System.out.println("返回本机处理器结果:" + num);
返回本机处理器结果:4
Runtime.getRuntime().freeMemory();
返回 Java 虚拟机中的空闲内存量。
Long memory = Runtime.getRuntime().freeMemory();
System.out.println(memory);
- gc();
运行垃圾回收器。
try {
Long memoryBefor = Runtime.getRuntime().freeMemory();
System.out.println("当前内存: "+memoryBefor);
Runtime.getRuntime().gc();
Long memoryAfter = Runtime.getRuntime().freeMemory();
System.out.println("执行完GC后内存:"+memoryAfter);
} catch (Exception e) {
e.printStackTrace();
}
当前内存: 15722728
执行完GC后内存:16027912
load(String filename)
加载作为动态库的指定文件名。maxMemory() ;
返回 Java 虚拟机试图使用的最大内存量。
Long maxMemeory = Runtime.getRuntime().maxMemory();
System.out.println(maxMemeory);
259522560totalMemory()
返回 Java 虚拟机中的内存总量。
try {
Long freeMemory = Runtime.getRuntime().freeMemory();
System.out.println(freeMemory);
Long totalMemory = Runtime.getRuntime().totalMemory();
System.out.println(totalMemory);
System.out.println("已使用:" + (totalMemory - freeMemory));
} catch (Exception e) {
e.printStackTrace();
}
15722728
16252928
已使用:530200
- traceInstructions(on)
启用/禁用跟踪的指令。如果布尔参数是正确的,该方法表明,Java虚拟机发出调试信息每条指令的执行虚拟机。这些信息的格式,文件或其他输出流释放它,取决于主机环境。虚拟机可能会忽略这个请求,如果它不支持此功能。跟踪输出的目的地是依赖于系统的。
如果布尔参数是假的,这个方法会导致虚拟机停止执行的详细指令跟踪执行。
我在本机(hotspot JDK1.8)不管如何测试,都没打印出任何信息,不知是否是虚拟机不支持还是什么情况。 - traceMethodCalls(on)
启用/禁用方法调用跟踪,同上。
3. RunTime应用
-
内存监控
我们可以结合RunTime方法几个特点,做个实时内存监控,如我监控某个方法执行消耗了多少内存
public static void main(String[] args) {
Long freeMemery1,freeMemery2;
try {
Runtime r = Runtime.getRuntime();
freeMemery1 = r.freeMemory();
aa();
freeMemery2 = r.freeMemory();
System.out.println("调用方法aa()使用了" + (freeMemery1 - freeMemery2));
} catch (Exception e) {
e.printStackTrace();
}
}
public static void aa(){
byte aa [] = new byte[1024 * 1024];
}
输出结果:
调用方法aa()使用了1048592
-
JVM实时系统内存监控
读者可根据上面的方法自行实现,实现依据是RunTime是单例的,在单机JVM上拿总内存减去空闲内存即可
-
系统小工具
可以windows平台上直接调用,如查看java -version
public static void main(String[] args) {
try {
Runtime r = Runtime.getRuntime();
Process process = r.exec("java");
InputStream in = process.getInputStream();
Scanner scanner;
scanner = new Scanner(in);
while (scanner.hasNext()) {
System.out.println(scanner.nextLine());
}
} catch (Exception e) {
e.printStackTrace();
}
}
总结
本文是举例说明了我们常见的几个方法,其中内存监控和exec最为常见。上面示例都实现并测试通过,如有不正确,请批评指正,谢谢。