模块  java.base
软件包  java.lang

Class Runtime


  • public class Runtime
    extends Object
    每个Java应用程序都有一个类Runtime实例,它允许应用程序与运行应用程序的环境进行交互。 可以从getRuntime方法获得当前运行时。

    应用程序无法创建自己的此类实例。

    从以下版本开始:
    1.0
    另请参见:
    getRuntime()
    • 方法详细信息

      • getRuntime

        public static Runtime getRuntime()
        返回与当前Java应用程序关联的运行时对象。 Runtime大多数方法都是实例方法,必须针对当前运行时对象调用。
        结果
        与当前Java应用程序关联的 Runtime对象。
      • exit

        public void exit​(int status)
        通过启动其关闭序列来终止当前运行的Java虚拟机。 此方法永远不会正常返回。 该参数用作状态代码; 按照惯例,非零状态代码表示异常终止。

        所有已注册的shutdown hooks (如果有)都以某种未指定的顺序启动,并允许它们同时运行直到完成。 完成此操作后,虚拟机halts

        如果在已经运行所有关闭挂钩并且状态为非零之后调用此方法,则此方法将使用给定的状态代码暂停虚拟机。 否则,此方法无限期地阻塞。

        System.exit方法是调用此方法的传统且方便的方法。

        参数
        status - 终止状态。 按照惯例,非零状态代码表示异常终止。
        异常
        SecurityException - 如果存在安全管理器且其 checkExit方法不允许以指定状态退出
        另请参见:
        SecurityExceptionSecurityManager.checkExit(int)addShutdownHook(java.lang.Thread)removeShutdownHook(java.lang.Thread)halt(int)
      • addShutdownHook

        public void addShutdownHook​(Thread hook)
        注册新的虚拟机关闭挂钩。

        Java虚拟机关闭以响应两种事件:

        • 在程序正常退出 ,当最后一个非守护线程退出时,或者当exit (等同于System.exit )方法被调用,或
        • 虚拟机将响应用户中断(例如键入^C )或系统范围的事件(例如用户注销或系统关闭)而终止

        关闭钩子只是一个初始化但未启动的线程。 当虚拟机开始其关闭序列时,它将以某种未指定的顺序启动所有已注册的关闭挂钩,并让它们同时运行。 当所有挂钩完成后,它将停止。 请注意,守护程序线程将在关闭序列期间继续运行,如果通过调用exit方法启动关闭,则非守护程序线程也将继续运行。

        关闭序列开始后,只能通过调用强制终止虚拟机的halt方法来停止它。

        关闭序列开始后,无法注册新的关闭挂钩或取消注册先前注册的挂钩。 尝试这些操作中的任何一个都会导致抛出IllegalStateException

        关闭挂钩在虚拟机的生命周期中的微妙时间运行,因此应该以防御方式编码。 特别是它们应该被编写为线程安全的并且尽可能避免死锁。 他们也不应盲目依赖可能已经注册了自己的关机钩子的服务,因此他们自己可能正在关闭。 例如,尝试使用其他基于线程的服务(例如AWT事件派发线程)可能会导致死锁。

        关机挂钩也应该快速完成工作。 当程序调用exit ,期望虚拟机将立即关闭并退出。 当虚拟机因用户注销或系统关闭而终止时,底层操作系统可能只允许一段固定的时间来关闭和退出。 因此,不建议尝试任何用户交互或在关闭钩子中执行长时间运行的计算。

        通过调用线程ThreadGroup对象的uncaughtException方法,就像在任何其他线程中一样,在关闭钩子中处理未捕获的异常。 此方法的默认实现将异常的堆栈跟踪打印到System.err并终止该线程; 它不会导致虚拟机退出或停止。

        在极少数情况下,虚拟机可能会中止 ,即停止运行而不会干净地关闭。 当外部终止虚拟机时会发生这种情况,例如Unix上的SIGKILL信号或Microsoft Windows上的TerminateProcess调用。 如果本机方法因例如破坏内部数据结构或尝试访问不存在的内存而出错,则虚拟机也可能中止。 如果虚拟机中止,则无法保证是否将运行任何关闭挂钩。

        参数
        hook - 初始化但未启动的Thread对象
        异常
        IllegalArgumentException - 如果已注册指定的挂钩,或者可以确定挂钩已在运行或已经运行
        IllegalStateException - 如果虚拟机已在关闭过程中
        SecurityException - 如果存在安全管理器且它拒绝RuntimePermission (“shutdownHooks”)
        从以下版本开始:
        1.3
        另请参见:
        removeShutdownHook(java.lang.Thread)halt(int)exit(int)
      • halt

        public void halt​(int status)
        强制终止当前运行的Java虚拟机。 此方法永远不会正常返回。

        应谨慎使用此方法。 exit方法不同,此方法不会导致启动关闭挂钩。 如果已经启动了关闭序列,则此方法不会等待任何正在运行的关闭挂钩完成其工作。

        参数
        status - 终止状态。 按照惯例,非零状态代码表示异常终止。 如果已调用exit (相当于System.exit )方法,则此状态代码将覆盖传递给该方法的状态代码。
        异常
        SecurityException - 如果存在安全管理器且其 checkExit方法不允许以指定状态退出
        从以下版本开始:
        1.3
        另请参见:
        exit(int)addShutdownHook(java.lang.Thread)removeShutdownHook(java.lang.Thread)
      • exec

        public Process exec​(String command,
                            String[] envp,
                            File dir)
                     throws IOException
        在具有指定环境和工作目录的单独进程中执行指定的字符串命令。

        这是一种方便的方法。 exec(command, envp, dir)形式的调用与调用exec (cmdarray, envp, dir) ,其中cmdarraycmdarray中所有标记的command

        更确切地说, command字符串使用由调用new {@link StringTokenizer}(command)创建的StringTokenizer分解为标记,而不进一步修改字符类别。 然后由令牌化器产生的令牌以相同的顺序放置在新的串阵列cmdarray中。

        参数
        command - 指定的系统命令。
        envp - 字符串数组,其中每个元素的格式为 name = value的环境变量设置,如果子进程应继承当前进程的环境, null
        dir - 子 dir的工作目录,如果子进程应继承当前进程的工作目录, null
        结果
        用于管理子进程的新Process对象
        异常
        SecurityException - 如果存在安全管理器且其 checkExec方法不允许创建子 进程
        IOException - 如果发生I / O错误
        NullPointerException -如果 commandnull ,或所述元件中的一个 envpnull
        IllegalArgumentException - 如果 command为空
        从以下版本开始:
        1.3
        另请参见:
        ProcessBuilder
      • exec

        public Process exec​(String[] cmdarray,
                            String[] envp)
                     throws IOException
        在具有指定环境的单独进程中执行指定的命令和参数。

        这是一种方便的方法。 调用窗体exec(cmdarray, envp)行为与调用exec (cmdarray, envp, null)

        参数
        cmdarray - 包含要调用的命令及其参数的数组。
        envp - 字符串数组,其中每个元素的格式为 name = value的环境变量设置,如果子进程应继承当前进程的环境, null
        结果
        用于管理子进程的新Process对象
        异常
        SecurityException - 如果存在安全管理器且其 checkExec方法不允许创建子 进程
        IOException - 如果发生I / O错误
        NullPointerException -如果 cmdarraynull ,或所述元件中的一个 cmdarraynull ,或所述元件中的一个 envpnull
        IndexOutOfBoundsException - 如果 cmdarray是空数组(长度为 0
        另请参见:
        ProcessBuilder
      • exec

        public Process exec​(String[] cmdarray,
                            String[] envp,
                            File dir)
                     throws IOException
        在具有指定环境和工作目录的单独进程中执行指定的命令和参数。

        给定的字符串数组cmdarray ,表示命令行的令牌,和一个字符串数组envp ,代表“环境”变量设置,此方法创建在其中执行指定的命令的新方法。

        此方法检查cmdarray是否为有效的操作系统命令。 哪些命令有效取决于系统,但至少该命令必须是非空字符串的非空列表。

        如果envpnull ,则子进程将继承当前进程的环境设置。

        在某些操作系统上启动进程可能需要一组最小的系统相关环境变量。 因此,子进程可以继承除指定环境中的其他环境变量设置。

        ProcessBuilder.start()现在是使用已修改环境启动进程的首选方法。

        新子dir的工作目录由dir指定。 如果dirnull ,则子null将继承当前进程的当前工作目录。

        如果存在安全管理器,则调用其checkExec方法,并将数组cmdarray的第一个组件作为其参数。 这可能会导致抛出SecurityException

        启动操作系统进程高度依赖于系统。 在许多可能出错的事情中:

        • 找不到操作系统程序文件。
        • 访问程序文件被拒绝。
        • 工作目录不存在。

        在这种情况下,将抛出异常。 异常的确切性质取决于系统,但它始终是IOException的子类。

        如果操作系统不支持创建进程,则将抛出UnsupportedOperationException

        参数
        cmdarray - 包含要调用的命令及其参数的数组。
        envp - 字符串数组,其每个元素的格式为 name = value的环境变量设置,如果子进程应继承当前进程的环境, null
        dir - 子 dir的工作目录,如果子进程应继承当前进程的工作目录, null
        结果
        用于管理子进程的新对象Process
        异常
        SecurityException - 如果存在安全管理器且其 checkExec方法不允许创建子 进程
        UnsupportedOperationException - 如果操作系统不支持创建进程。
        IOException - 如果发生I / O错误
        NullPointerException -如果 cmdarraynull ,或所述元件中的一个 cmdarraynull ,或所述元件中的一个 envpnull
        IndexOutOfBoundsException - 如果 cmdarray是空数组(长度为 0
        从以下版本开始:
        1.3
        另请参见:
        ProcessBuilder
      • availableProcessors

        public int availableProcessors()
        返回Java虚拟机可用的处理器数。

        在特定的虚拟机调用期间,此值可能会更改。 因此,对可用处理器数量敏感的应用程序应偶尔轮询此属性并适当调整其资源使用情况。

        结果
        虚拟机可用的最大处理器数量; 永远不会小于一个
        从以下版本开始:
        1.4
      • freeMemory

        public long freeMemory()
        返回Java虚拟机中的可用内存量。 调用gc方法可能会导致freeMemory.返回的值增加
        结果
        当前可用于未来分配对象的内存总量的近似值,以字节为单位。
      • totalMemory

        public long totalMemory()
        返回Java虚拟机中的内存总量。 此方法返回的值可能会随时间而变化,具体取决于主机环境。

        请注意,保存任何给定类型的对象所需的内存量可能与实现有关。

        结果
        当前可用于当前和未来对象的内存总量,以字节为单位。
      • maxMemory

        public long maxMemory()
        返回Java虚拟机将尝试使用的最大内存量。 如果没有固有限制,则返回值Long.MAX_VALUE
        结果
        虚拟机将尝试使用的最大内存量,以字节为单位
        从以下版本开始:
        1.4
      • gc

        public void gc()
        运行垃圾收集器。 调用此方法表明Java虚拟机花费了大量精力来回收未使用的对象,以使其当前占用的内存可用于快速重用。 当控制从方法调用返回时,虚拟机已尽最大努力回收所有丢弃的对象。

        名称gc代表“垃圾收集器”。 即使未明确调用gc方法,虚拟机也会根据需要在单独的线程中自动执行此回收过程。

        方法System.gc()是调用该方法的传统且方便的手段。

      • runFinalization

        public void runFinalization()
        运行待完成的任何对象的终结方法。 调用此方法表明Java虚拟机花费了finalize来运行已被发现被丢弃但尚未运行其finalize方法的finalize方法。 当控制从方法调用返回时,虚拟机已尽最大努力完成所有未完成的终结。

        如果未明确调用runFinalization方法,则虚拟机将根据需要在单独的线程中自动执行完成过程。

        方法System.runFinalization()是调用该方法的传统且方便的手段。

        另请参见:
        Object.finalize()
      • traceInstructions

        @Deprecated(since="9",
                    forRemoval=true)
        public void traceInstructions​(boolean on)
        Deprecated, for removal: This API element is subject to removal in a future version.
        This method was intended to control instruction tracing. It has been superseded by JVM-specific tracing mechanisms. This method is subject to removal in a future version of Java SE.
        没有实现,什么都不做。
        参数
        on - 被忽略了
      • traceMethodCalls

        @Deprecated(since="9",
                    forRemoval=true)
        public void traceMethodCalls​(boolean on)
        Deprecated, for removal: This API element is subject to removal in a future version.
        This method was intended to control method call tracing. It has been superseded by JVM-specific tracing mechanisms. This method is subject to removal in a future version of Java SE.
        没有实现,什么都不做。
        参数
        on - 被忽略了
      • load

        public void load​(String filename)
        加载filename参数指定的本机库。 filename参数必须是绝对路径名。 (例如Runtime.getRuntime().load("/home/avh/lib/libX11.so"); )。 如果filename参数在剥离任何特定于平台的库前缀,路径和文件扩展名时,表示名称为L的库,并且名为L的本机库与VM静态链接,则表示JNI_OnLoad_L函数调用库导出而不是尝试加载动态库。 与参数匹配的文件名不必存在于文件系统中。 有关详细信息,请参阅JNI Specification 否则,filename参数将以依赖于实现的方式映射到本机库映像。

        首先,如果有安全管理器, checkLink filename作为参数调用其checkLink方法。 这可能会导致安全性异常。

        这类似于方法loadLibrary(String) ,但它接受一般文件名作为参数而不仅仅是库名,允许加载任何本机代码文件。

        方法System.load(String)是调用该方法的传统且方便的手段。

        参数
        filename - 要加载的文件。
        异常
        SecurityException - 如果存在安全管理器且其 checkLink方法不允许加载指定的动态库
        UnsatisfiedLinkError - 如果文件名不是绝对路径名,则本机库不与VM静态链接,或者主机系统无法将库映射到本机库映像。
        NullPointerException - 如果 filenamenull
        另请参见:
        getRuntime()SecurityExceptionSecurityManager.checkLink(java.lang.String)
      • loadLibrary

        public void loadLibrary​(String libname)
        加载libname参数指定的本机库。 libname参数不得包含任何特定于平台的前缀,文件扩展名或路径。 如果名为libname的本机库与VM静态链接,则调用库导出的JNI_OnLoad_ libname函数。 有关详细信息,请参阅JNI Specification 否则,libname参数从系统库位置加载,并以依赖于实现的方式映射到本机库映像。

        首先,如果有安全管理器, checkLink libname作为其参数调用其checkLink方法。 这可能会导致安全性异常。

        方法System.loadLibrary(String)是调用该方法的传统且方便的手段。 如果要在类的实现中使用本机方法,则标准策略是将本机代码放入库文件(称为LibFile ),然后放置静态初始化程序:

         static { System.loadLibrary("LibFile"); }
         
        在类声明中。 当加载并初始化类时,也将加载本机方法的必要本机代码实现。

        如果使用相同的库名称多次调用此方法,则忽略第二次和后续调用。

        参数
        libname - 库的名称。
        异常
        SecurityException - 如果存在安全管理器且其 checkLink方法不允许加载指定的动态库
        UnsatisfiedLinkError - 如果libname参数包含文件路径,则本机库不与VM静态链接,或者主机系统无法将库映射到本机库映像。
        NullPointerException - 如果 libnamenull
        另请参见:
        SecurityExceptionSecurityManager.checkLink(java.lang.String)