概述
Runtime类封装了运行时的环境。每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。
我们不能实例化一个Runtime对象,应用程序也不能创建自己的 Runtime 类实例,但可以通过 getRuntime 方法获取当前Runtime运行时对象的引用。一旦得到了一个当前的Runtime对象的引用,就可以调用Runtime对象的方法去控制Java虚拟机的状态和行为
当Applet和其他不被信任的代码调用任何Runtime方法时,常常会引起SecurityException异常。
API方法示例
我们先来看看几个native方法:
public native int availableProcessors(); public native long freeMemory(); public native long totalMemory(); public native long maxMemory();
使用示例如下:
Runtime rt = Runtime.getRuntime(); System.out.println("处理器数量:" + rt.availableProcessors()); //处理器数量:4 System.out.println("空闲内存数:" + rt.freeMemory() / 1024 / 1024 + "mb"); //空闲内存数:111mb System.out.println("总内存数:" + rt.totalMemory() / 1024 / 1024 + "mb"); //总内存数:120mb System.out.println("可用最大内存数:" + rt.maxMemory() / 1024 / 1024 + "mb"); //可用最大内存数:1910mb
使用场景:
通过totalMemory()和freeMemory()方法可以知道对象的堆内存有多大,还剩多少。
Java会周期性的回收垃圾对象(未使用的对象),以便释放内存空间。但是如果想先于收集器的下一次指定周期来收集废弃的对象,可以通过调用gc()方法来根据需要运行无用单元收集器。一个很好的试验方法是先调用gc()方法,然后调用freeMemory()方法来查看基本的内存使用情况,接着执行代码,然后再次调用freeMemory()方法看看分配了多少内存。
version()方法 (since Java9)
java9t提供了Version方法,可以放我们和方便的获取到运行时的一些参数信息,可以说是非常的人性化。我们看看这个方法源码:
public static Version version() { if (version == null) { version = new Version(VersionProps.versionNumbers(), VersionProps.pre(), VersionProps.build(), VersionProps.optional()); } return version; }
我们发现所有的参数都来自于VersionProps,所以我们贴一些它的源码,大家就都清晰了
class VersionProps { private static final String launcher_name = "java"; private static final String java_version = "10.0.2"; private static final String java_version_date = "2018-07-17"; private static final String java_runtime_name = "Java(TM) SE Runtime Environment"; private static final String java_runtime_version = "10.0.2+13"; private static final String VERSION_NUMBER = "10.0.2"; private static final String VERSION_BUILD = "13"; private static final String VERSION_PRE = ""; private static final String VERSION_OPT = ""; private static final boolean isLTS = "".startsWith("LTS"); private static final String VENDOR_VERSION_STRING = "18.3"; private static final String vendor_version = (VENDOR_VERSION_STRING.length() > 0 ? " " + VENDOR_VERSION_STRING : ""); static { init(); } }
由于我的JDK版本是Java10,所以各位的参数可能和我的不太一样。我运行一下如下:
System.out.println(Runtime.version()); //10.0.2+13
执行其它程序
在安全的环境中,可以在多任务操作系统中使用Java去执行其他特别大的进程(也就是程序)。ecec()方法有几种形式命名想要运行的程序和它的输入参数。ecec()方法返回一个Process对象,可以使用这个对象控制Java程序与新运行的进程进行交互。ecec()方法本质是依赖于环境。
public static void main(String[] args) throws IOException { Runtime rt = Runtime.getRuntime(); //rt.exec("notepad.exe"); //打开记事本 备注:.exe可以省略 下同 Process process = rt.exec("calc.exe");//打开计算器 System.out.println(process); //Process[pid=8108, exitValue="not exited"] }
在新程序开始运行后就可以使用Process的方法了。可以用destory()方法杀死子进程,也可以使用waitFor()方法等待程序直到子程序结束,exitValue()方法返回子进程结束时返回的值。如果没有错误,将返回0,否则返回非0。
public static void main(String[] args) throws IOException, InterruptedException { Runtime rt = Runtime.getRuntime(); Process process = rt.exec("notepad.exe"); //打开记事本 备注:.exe可以省略 下同 //Process process = rt.exec("calc.exe");//打开计算器 process.waitFor(); //阻塞 等到子进程执行结束 System.out.println("字进行执行完事了~~~"); process.destroyForcibly(); //强制杀死子进程 destroy } 运行结果:(当关闭记事本后,会接着运行程序,打印信息)
和Gc相关的方法
exit(int status)
通过启动虚拟机的关闭序列,终止当前正在运行的 Java 虚拟机。
gc()
运行垃圾回收器。
halt(int status)
强行终止目前正在运行的 Java 虚拟机。
load和loadLibrary
这两个方法是我们在使用Java的JNI机制时,会用到的一个非常重要的函数,它的作用即是把实现了我们在Java code中声明的native方法的那个libraryload进来,或者load其他什么动态连接库
这儿JNI编程才会用到。小弟不才,这里只能先给一个大写的略字了