一.了解Runtime类


Runtime:运行时,是一个封装了JVM的类。每一个JAVA程序实际上都是启动了一个JVM进程,每一个JVM进程都对应一个Runtime实例,此实例是由JVM为其实例化的。所以我们不能实例化一个Runtime对象,应用程序也不能创建自己的 Runtime 类实例,但可以通过 getRuntime 方法获取当前Runtime运行时对象的引用。一旦得到了一个当前的Runtime对象的引用,就可以调用Runtime对象的方法去控制Java虚拟机的状态和行为。


查看官方文档可以看到,Runtime类中没有构造方法,本类的构造方法被私有化了, 所以才会有getRuntime方法返回本来的实例化对象,这与单例设计模式不谋而合



public static Runtime



直接使用此静态方法可以取得Runtime类的实例
Runtime类的常用方法

Java runtime打开程序 java中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());
	}
}

Java runtime打开程序 java中runtime类_jvm_02


验证->频繁改变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());
	}
}

Java runtime打开程序 java中runtime类_Runtime_03


使用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());
	}
}

Java runtime打开程序 java中runtime类_单例设计模式_04


可以看到利用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());
	}
}

Java runtime打开程序 java中runtime类_java_05




三.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()方法释放掉垃圾空间,还可以运行本机的程序