介绍
Runtime类用于表示虚拟机运行时的状态,它用于封装JVM虚拟机进程。每次使用java命令启动虚拟机都对应一个Runtime实例,并且只有一个实例。
因此在Runtime类定义的时候,它的构造方法已经被私有化了(单例设计模式的应用),对象不可以直接实例化。若想在程序中获得一个Runtime实例,只能通过以下方式:
Runtime runtime = Runtime.getRuntime();
由于Runtime类封装了虚拟机进程,因此,在程序中通常会通过该类的实例对象来获取当前虚拟机的相关信息。
常用方法和功能包括:
getRuntime()
: 该静态方法返回当前Java应用程序的运行时对象。exec(String command)
: 这个方法用于在操作系统中执行指定的命令。它创建一个新的进程并在其中执行给定的命令。freeMemory()
: 返回当前Java虚拟机中的空闲内存量。maxMemory()
: 返回Java虚拟机可以使用的最大内存量,即堆的最大容量。availableProcessors()
: 返回可用的处理器数量。totalMemory()
: 返回Java虚拟机当前已经使用的总内存量。
这些方法允许Java应用程序与其运行时环境进行交互,获取内存使用情况、执行系统命令等操作。需要注意的是,在使用exec()
方法执行系统命令时,可能需要处理输入流和输出流,以便与子进程进行通信,并正确处理可能的异常情况。
获取当前虚拟机信息
Runtime类可以获取当前Java虚拟机的处理器的个数、空闲内存量、最大可用内存量和内存总量的信息。
public class myclass {
public static void main(String[] args) {
Runtime rt = Runtime.getRuntime(); // 获取
System.out.println("处理器的个数: " + rt.availableProcessors()+"个");
System.out.println("空闲内存数量: " + rt.freeMemory() / 1024 / 1024
+ "M");
System.out.println("最大可用内存数量: " + rt.maxMemory() / 1024 /
1024 + "M");
System.out.println("虚拟机中内存总量: " + rt.totalMemory() / 1024 /
1024 + "M");
}
}
由于每个人的机器配置不同,该示例的打印结果可能不同,另外空闲内存数、可用最大内存数和内存总量都是以字节为单位计算的,上述运行结果已经将字节换算成了兆(M)。
操作系统进程
Runtime类中提供了一个exec()方法,该方法用于执行一个dos命令,从而实现和在命令行窗口中输入dos命令同样的效果。例如,通过运行“notepad.exe”命令打开一个Windows自带的记事本程序。
import java.io.IOException;
public class myclass{
public static void main(String[] args) throws IOException {
Runtime rt = Runtime.getRuntime(); // 创建Runtime实例对象
rt.exec("notepad.exe"); // 调用exec()方法
}
}
程序运行后,会在Windows系统中产生一个新的进程notepad.exe,可以通过任务管理器进行观察。
查阅API文档会发现,Runtime类的exec()方法返回一个Process对象,该对象就是exec()所生成的新进程,通过该对象可以对产生的新进程进行管理,如关闭此进程只需调用destroy()方法即可。具有代码如下所示:
import java.io.IOException;
public class MyClass {
public static void main(String[] args) {
try {
Process process = Runtime.getRuntime().exec("notepad.exe");
// 休眠3秒
Thread.sleep(3000);
// 关闭记事本应用程序
Runtime.getRuntime().exec("taskkill /F /IM notepad.exe");
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
上述代码中,通过调用Process对象的destroy()方法关闭了打开的记事本。为了突出演示的效果,使用了Thread类的静态方法sleep(long millis)使程序休眠了3秒,因此,程序运行后,会看到打开的记事本在3秒后自动关闭了。