一.了解Runtime类
查看官方文档可以看到,Runtime类中没有构造方法,本类的构造方法被私有化了, 所以才会有getRuntime方法返回本来的实例化对象,这与单例设计模式不谋而合
public static Runtime getRuntime()
直接使用此静态方法可以取得Runtime类的实例
Runtime类的常用方法
二.使用Runtime获取JVM的空间信息
1.得到JVM信息
每一个Runtime对象都是JVM实例化的,所以可以通过Runtime类取得相关信息
public class RuntimeDemo01{
public static void main(String[] args){
Runtime run = Runtime.getRuntime(); //通过Runtime类的静态方法获取Runtime类的实例
System.out.println("JVM最大内存量:"+run.maxMemory());
System.out.println("JVM空闲内存量:"+run.freeMemory());
}
}
验证->频繁改变String类字符串引用造成内存浪费,产生大量垃圾:
public class RuntimeDemo01{ public static void main(String[] args){ Runtime run = Runtime.getRuntime(); //通过Runtime类的静态方法获取Runtime类的实例 System.out.println("JVM最大内存量:"+run.maxMemory()); System.out.println("JVM空闲内存量:"+run.freeMemory()); String str = "Hello"+"World"; System.out.println(str); for(int i=0;i<2000;i++){ str = str + i; } System.out.println("JVM空闲内存量:"+run.freeMemory()); } }
使用StringBuffer类实现同样效果,看一下内存使用情况:
public class RuntimeDemo02{ public static void main(String[] args){ Runtime run = Runtime.getRuntime(); //通过Runtime类的静态方法获取Runtime类的实例 System.out.println("JVM最大内存量:"+run.maxMemory()); System.out.println("JVM空闲内存量:"+run.freeMemory()); StringBuffer buf = new StringBuffer(); buf.append("Hello").append("World"); System.out.println(buf); for(int i=0;i<2000;i++){ buf.append(i); } System.out.println("JVM空闲内存量:"+run.freeMemory()); } }
可以看到利用StringBuffer实现并未产生垃圾,节省了空间。既然使用String类改变字符串引用产生大量的垃圾,则需要进行垃圾处理,释放空间
2.JVM垃圾回收
public void gc()
public class RuntimeDemo01{ public static void main(String[] args){ Runtime run = Runtime.getRuntime(); //通过Runtime类的静态方法获取Runtime类的实例 System.out.println("JVM最大内存量:"+run.maxMemory()); System.out.println("JVM空闲内存量:"+run.freeMemory()); String str = "Hello"+"World"; System.out.println(str); for(int i=0;i<2000;i++){ str = str + i; } System.out.println("操作String之后的JVM空闲内存量:"+run.freeMemory()); run.gc(); System.out.println("垃圾回收之后的JVM空闲内存量:"+run.freeMemory()); } }
![]()
三.Runtime类与Process类
除了观察内存使用量之外,还可以直接使用Runtime类运行本机的可执行程序。
public Process exec(String command)throwsIOException
例如:调用记事本:
public class RuntimeDemo03{ public static void main(String[] args){ Runtime run = Runtime.getRuntime(); //通过Runtime类的静态方法获取Runtime类的实例 try{ run.exec("notepad.exe"); //调用本机程序,此方法需要进行异常处理 }catch(Exception e){ e.printStackTrace(); } } }
exec()方法的返回值是Process类,Process类也有一些方法可以使用,比如结束一个进程,通过destroy()结束
注意:Runtime类本身就是单例设计模式的一种应用,因为整个JVM中只存在一个Runtime类的对象,可以使用Runtime类取得JVM的系统信息,或者使用gc()方法释放掉垃圾空间,还可以运行本机的程序