Runtime类:是封装JVM进程的类。每个Java程序运行的时候,JVM会自动为其创建一个JVM进程用来记录当前程序运行时的环境并将其封装在Runtime类的实例中。应用程序可以通过该实例了解程序运行时的一些信息,如可用处理器的数目、最大内存量、可用内存量等。
一、查看内存信息:
public static void main(String[] args) {
Runtime run= Runtime.getRuntime();//单例模式,实例化对象
//availableProcessors:向 Java 虚拟机返回可用处理器的数目。
System.out.println("可用处理器的数目:"+run.availableProcessors());//4
//totalMemory():返回 Java 虚拟机中的内存总量。此方法返回的值可能随时间的推移而变化,这取决于主机环境。
System.out.println("当前JVM的内存总量:"+run.totalMemory());//1065484288
//maxMemory():返回 Java 虚拟机试图使用的最大内存量。如果内存本身没有限制,则返回值 Long.MAX_VALUE。
//Long.MAX_VALUE:保持 long 类型的最大值的常量,该值为 (2e63)-1。
System.out.println("当前JVM的最大内存量:"+run.maxMemory());//1065484288
//freeMemory():返回 Java 虚拟机中的空闲内存量。调用 gc 方法可能导致 freeMemory 返回值的增加。
long freeM1 = run.freeMemory();
System.out.println("当前JVM的空闲内存量:"+freeM1);//1064163064
//通过String循环操作消耗内存
String str="";
for(int i=0;i<10000;i++){
str+=i;
}
long freeM2 = run.freeMemory();
System.out.println("String循环之后JVM的空闲内存量:"+freeM2);//1028886392
System.out.println("String循环消耗的内存量:"+(freeM1-freeM2));//35276672
//通过StringBuffer循环操作消耗内存量
StringBuffer strBuf = new StringBuffer("");
for(int i=0;i<10000;i++){
strBuf.append(i);
}
long freeM3 = run.freeMemory();
System.out.println("StringBuffer循环之后JVM的空闲内存量:"+freeM3);//1028628320
System.out.println("StringBuffer循环消耗的内存量:"+(freeM2-freeM3));//258072
//outout:35018600
System.out.println("String循环比StringBuffer循环多消耗内存量:"+((freeM1-freeM2)-(freeM2-freeM3)));
//进行垃圾回收
run.gc();
System.out.println("垃圾回收之后的内存量:"+run.freeMemory());//1064789304
}
二、执行操作系统的命令:
如打开记事本,5秒以后自动关闭记事本。
执行命令调用Runtime的exec方法,API中的说明如下:
public Process exec(String command) throws IOException:在单独的进程中执行指定的字符串命令。
自动关闭记事本主要用process.destroy()结束进程。
public static void main(String[] args) {
Runtime run= Runtime.getRuntime();//单例模式,实例化对象
try{
Process process = run.exec("notepad.exe");//执行命令并记录使用此命令开启的进程信息
Thread.sleep(10000);//休眠5秒
process.destroy();//结束进程
//exitValue:返回子进程的出口值。
//返回:此 Process 对象表示的子进程的出口值。
//根据惯例,值 0 表示正常终止,如点击记事本关闭按钮进行关闭。
//值1表示非正常终止,如通过手动结束进程或调用process.destroy()的方法。
System.out.println(process.exitValue());
}catch(Exception e){
e.printStackTrace();
}
}