文章目录

  • Runtime类是什么?
  • Runtime类能做什么
  • 1.查看系统内存
  • 2.调用系统本地程序
  • 3.加载动态链接库
  • 4.终止虚拟机


Runtime类是什么?

  1. 每个java程序在运行时相当于启动了一个JVM进程,每个JVM进程都对应一个RunTime实例
  2. RunTime是JVM负责实例化的,且使用了单例设计模式,必须通过RunTime内部的getRuntime()方法获取实例化对象
  3. java runtime启动 java runtime机制_Jvm

  4. 通过Runtime对象的方法可以查看Java虚拟机的状态以及控制虚拟机的行为。
  5. System许多函数的使用都是等价于Runtime.getRuntime(),可见System和Runtime之间的联系是多么密切,实际上System是依赖于Runtime类的。

Runtime类能做什么

1.查看系统内存

java runtime启动 java runtime机制_Jvm_02

上图4个native方法,分别返回JVM内核数、空闲内存、总内存、最大内存

@Test
public void runtimeInfo() {
    Runtime runtime = Runtime.getRuntime();
    int processors = runtime.availableProcessors();//法返回JVM(Java虚拟机)可用的处理器数。
    long freeMemory = runtime.freeMemory();//返回JVM(Java虚拟机)中的可用内存量
    long maxMemory = runtime.maxMemory();//返回JVM(Java虚拟机)中的总内存量
    long totalMemory = runtime.totalMemory();//返回Java虚拟机将尝试使用的最大内存量。如果没有固有限制,则返回值Long.MAX_VALUE。

    // processors=4, freeMemory=165713400, maxMemory=2837446656, totalMemory=192937984
    logger.debug("processors={}, freeMemory={}, maxMemory={}, totalMemory={}", processors, freeMemory, maxMemory, totalMemory);
}

2.调用系统本地程序

java runtime启动 java runtime机制_System_03

//通过调用 javac -version 获取JDK版本信息
 @Test
    public void getJavaVersion() {
        try {
            Process process = Runtime.getRuntime().exec("java -version");
            BufferedReader br = new BufferedReader(new InputStreamReader(process.getErrorStream()));
            String line = null;
            while ((line = br.readLine()) != null) {
                System.out.println(line); 
            }

            process.waitFor();
            System.out.println("Process exitValue: " + process.exitValue()); //0
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

java runtime启动 java runtime机制_java runtime启动_04

Process的主要方法

destroy()//杀掉子进程。

exitValue()//返回子进程的出口值。

InputStream getErrorStream()//获得子进程的错误流。

InputStream getInputStream()// 获得子进程的输入流。

OutputStream getOutputStream()//获得子进程的输出流。

waitFor()// 导致当前线程等待,如果必要,一直要等到由该 Process 对象表示的进程已经终止。
/*一般执行linux命令使用比较多的是waitFor(),诸塞等待子进程完成该linux命令。然后再继续线程后续的代码。*/

3.加载动态链接库

load()可以加载动态链接库,如linux下的so文件,win下的dll文件。

java runtime启动 java runtime机制_Process_05

4.终止虚拟机

Runtime.getRuntime().exit(0);//通过启动JVM关闭命令来终止当前运行的Java虚拟机。
Runtime.getRuntime().halt(0);//此方法强制终止当前运行的Java虚拟机。此方法永远不会正常返回。应谨慎使用此方法。