黑马程序员——java.lang.Runtime

来源:互联网 发布:直销矩阵制示意图 编辑:程序博客网 时间:2024/06/03 12:30
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


概念

Runtime类封装了运行时的环境。每个Java应用程序都有一个与之对应的Runtime类实例,使应用程序能够与其运行的环境相连接。

因为每个Java程序都会启动一个JVM进程,所以我们可以认为Runtime(运行时):是一个封装了JVM进程的类,每一个JVM进程都是对应这一个Runtime实例,此实例是由JVM实例化的.在整个JVM中只存在一个Runtime类的对象。

一般不能实例化一个Runtime对象,应用程序也不能创建自己的 Runtime 类实例,但可以通过 Runtime.getRuntime 方法获取当前Runtime运行时对象的引用(注意:Runtime是个单例类,调用Runtime.getRuntime()返回的是同一个对象)。

一旦得到了一个当前的Runtime对象的引用,就可以调用Runtime对象的方法去控制Java虚拟机的状态和行为。


如何获得Runtime对象?

//Runtime类的构造方法被私有化了只能//通过Runtime类的静态方法进行实例化  Runtime run=Runtime.getRuntime();  

Runtime.getRuntime()可以取得当前JVM的运行时环境,这也是在Java中唯一一个得到运行时环境的方法。


常用API:

void addShutdowmHook(Thread hook)

  向当前虚拟机注册一个新的ShutdownHook

参见:黑马程序员——Java中的ShutdownHook

int avaliableProcessors()

  返回JVM可用的处理器的数目

Process exec(... ...)

  该方法有6种重载形式,都是在单独的进程中执行指定的命令,具体区别请参见API文档。

void exit(int status)

  通过启动JVM的关闭序列,终止当前正在运行的JVM。

  exit方法是退出当前JVM的方法,估计也是唯一的一个吧,因为System类中的exit实际上也是通过调用 Runtime.exit()来退出JVM的。这里说明一下Java对Runtime返回值的一般规则(后边也提到了),0代表正常退出,非0代表异常中 止,这只是Java的规则,在各个操作系统中总会发生一些小的混淆。

long freeMemory()

  返回当前JVM可用的空闲内存(可用堆内存的大小)

void gc()

  建议系统运行垃圾回收机制(仅仅是建议而已)

void halt(int status)

  强行终止当前正在运行的JVM(如果在JVM的关闭序列执行期间调用此方法,将导致关闭序列不能执行完毕)

long maxMemory()

  返回当前JVM可用的最大内存

boolean removeShutdownHook(Thread hook)

  将一个曾将注册过的挂钩解除注册

void runFinalization()

  强制系统调用所有不可及对象的终结方法

long totalMemory()

  返回当前JVM已经申请到的所有内存的大小


下面单独说一下exit方法。

exit方法的作用是退出当前正在运行的JVM。我们打开一个java应用程序,就会启动一个JVM进程,该应用程序所有的功能都在这一个JVM中执行,如果我们在某一个功能中调用了exit方法,将导致当前应用程序所属的JVM退出,从而使整个应用程序结束。

在GUI编程中,窗口控件有一个dispose方法,该方法的作用是销毁调用该方法的窗口,即将调用该方法的窗口所占用的内存空间释放,但是不会结束当前的JVM。

下面的内容摘自API文档,是关于exit方法的官方说明:

Terminates the currently running Java virtual machine by initiating its shutdown sequence. This method never returns normally. The argument serves as a status code; by convention, a nonzero status code indicates abnormal termination.

The virtual machine's shutdown sequence consists of two phases. In the first phase all registered shutdown hooks, if any, are started in some unspecified order and allowed to run concurrently until they finish. In the second phase all uninvoked finalizers are run if finalization-on-exit has been enabled. Once this is done the virtual machine halts.

If this method is invoked after the virtual machine has begun its shutdown sequence then if shutdown hooks are being run this method will block indefinitely. If shutdown hooks have already been run and on-exit finalization has been enabled then this method halts the virtual machine with the given status code if the status is nonzero; otherwise, it blocks indefinitely.

exit方法有一个名为状态码的参数,0代表正常终止,非0代表异常终止。(不太理解什么意思,既然JVM都要退出了,还传个参数进去干嘛)


下面再说一下gc和runFinalization方法。

gc是建议JVM进行垃圾回收,仅仅是建议,至于系统是否执行、何时执行都是不确定的,我们可以理解为我们调用gc方法可以提高垃圾回收线程的优先级,使它有更多的机会运行,但何时运行还不确定。

系统完成一次垃圾回收至少需要2次运行垃圾回收线程,第一次运行垃圾回收线程会标记所有可以回收的垃圾对象,第二次运行垃圾回收线程先调用垃圾对象的finalize方法,然后释放该对象占用的内存空间。

所以如果仅仅调用了gc方法,就可能出现系统标记了所有垃圾对象,但没有释放垃圾对象占用的内存资源的情况(即无法看到垃圾对象finalize方法的调用)。

runFinalization方法则是建议系统调用所有已经标记的垃圾对象的finalize方法,并释放它们占用的内存空间。你可以尝试一下只调用runFinalization方法而不调用gc方法,你会发现系统既不会启动垃圾回收线程去标记垃圾对象,也不会调用垃圾对象的finalize方法(可能系统去调用了所有垃圾对象的finalize方法,但是因为没有被标记为垃圾的对象,所以没法调用任何对象的finalize方法)。


参考:

java runtime入门(带有Runtime的详细API文档)

Java中Runtime的使用(带有exec命令的讲解)

0 0
原创粉丝点击