鸿蒙OS Runtime
Runtime
java.lang.Object
|---java.lang.Runtime
public class Runtime
extends Object
每个 Java 应用程序都有一个 Runtime 类的实例,它允许应用程序与运行应用程序的环境进行交互。 当前运行时可以从 getRuntime 方法中获取。
应用程序无法创建自己的此类实例。
方法总结
修饰符和类型 | 方法 | 描述 |
---|---|---|
void | addShutdownHook(Thread hook) | 注册一个新的虚拟机关闭挂钩。 |
int | availableProcessors() | 返回 Java 虚拟机可用的处理器数量。 |
Process | exec(String command) | 在单独的进程中执行指定的字符串命令。 |
Process | exec(String[] cmdarray) | 在单独的进程中执行指定的命令和参数。 |
Process | exec(String[] cmdarray, String[] envp) | 在具有指定环境的单独进程中执行指定的命令和参数。 |
Process | exec(String[] cmdarray, String[] envp, File dir) | 在具有指定环境和工作目录的单独进程中执行指定的命令和参数。 |
Process | exec(String command, String[] envp) | 在具有指定环境的单独进程中执行指定的字符串命令。 |
Process | exec(String command, String[] envp, File dir) | 在具有指定环境和工作目录的单独进程中执行指定的字符串命令。 |
void | exit(int status) | 通过启动其关闭序列来终止当前正在运行的 Java 虚拟机。 |
long | freeMemory() | 返回 Java 虚拟机中的可用内存量。 |
void | gc() | 运行垃圾收集器。 |
InputStream | getLocalizedInputStream(InputStream in) | 已弃用。 从 JDK 1.1 开始,将本地编码中的字节流转换为 Unicode 中的字符流的首选方法是通过 InputStreamReader 和 BufferedReader 类。 |
OutputStream | getLocalizedOutputStream(OutputStream out) | 已弃用。 从 JDK 1.1 开始,将 Unicode 字符流转换为本地编码的字节流的首选方法是通过 OutputStreamWriter、BufferedWriter 和 PrintWriter 类。 |
static Runtime | getRuntime() | 返回与当前 Java 应用程序关联的运行时对象。 |
void | halt(int status) | 强制终止当前运行的 Java 虚拟机。 |
void | load(String filename) | 加载由文件名参数指定的本机库。 |
void | loadLibrary(String libname) | 加载由 libname 参数指定的本机库。 |
long | maxMemory() | 返回 Java 虚拟机将尝试使用的最大内存量。 |
boolean | removeShutdownHook(Thread hook) | 取消注册以前注册的虚拟机关闭挂钩。 |
void | runFinalization() | 运行任何等待终结的对象的终结方法。 |
static void | runFinalizersOnExit(boolean value) | 已弃用。 这种方法本质上是不安全的。 这可能会导致在其他线程同时操作这些对象时对活动对象调用终结器,从而导致行为不稳定或死锁。 |
long | totalMemory() | 返回 Java 虚拟机中的内存总量。 |
void | traceInstructions(boolean on) | 启用/禁用指令跟踪。 |
void | traceMethodCalls(boolean on) | 启用/禁用方法调用的跟踪。 |
从类 java.lang.Object 继承的方法 |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
方法详情
getRuntime
public static Runtime getRuntime()
返回与当前 Java 应用程序关联的运行时对象。 Runtime 类的大部分方法都是实例方法,必须针对当前运行时对象调用。
返回:
与当前 Java 应用程序关联的运行时对象。
exit
public void exit(int status)
通过启动其关闭序列来终止当前正在运行的 Java 虚拟机。此方法永远不会正常返回。该参数用作状态码;按照惯例,非零状态码表示异常终止。
虚拟机的关闭顺序包括两个阶段。在第一阶段,所有已注册的关闭挂钩(如果有)都以某种未指定的顺序启动,并允许同时运行直到它们完成。在第二阶段,如果 finalization-on-exit 已启用,则所有未调用的终结器都会运行。完成此操作后,虚拟机将停止。
如果在虚拟机开始其关闭序列之后调用此方法,则如果正在运行关闭挂钩,则此方法将无限期阻塞。如果已经运行了关闭挂钩并且已启用退出终止,则此方法会在状态非零时使用给定的状态代码暂停虚拟机;否则,它会无限期地阻塞。
System#exit(int) 方法是调用此方法的常规且方便的方法。
参数:
参数名称 | 参数描述 |
---|---|
status | 终止状态。 按照惯例,非零状态码表示异常终止。 |
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果存在安全管理器并且其 SecurityManager#checkExit 方法不允许以指定状态退出 |
addShutdownHook
public void addShutdownHook(Thread hook)
注册一个新的虚拟机关闭挂钩。
Java 虚拟机关闭以响应两种事件:
- 程序正常退出,当最后一个非守护线程退出或调用 exit(等效于 System#exit(int))方法时,或
- 虚拟机响应用户中断(例如键入 ^C)或系统范围的事件(例如用户注销或系统关闭)而终止。
关闭挂钩只是一个已初始化但未启动的线程。当虚拟机开始其关闭序列时,它将以某种未指定的顺序启动所有已注册的关闭挂钩并让它们同时运行。当所有钩子都完成后,如果 finalization-on-exit 已启用,它将运行所有未调用的终结器。最后,虚拟机将停止。请注意,在关闭序列期间,守护线程将继续运行,如果通过调用 exit 方法启动关闭,非守护线程也将继续运行。
一旦关闭序列开始,它只能通过调用halt方法来停止,该方法会强制终止虚拟机。
一旦关闭序列开始,就不可能注册新的关闭挂钩或取消注册先前注册的挂钩。尝试这些操作中的任何一个都将导致抛出 IllegalStateException。
关闭挂钩在虚拟机生命周期的一个微妙时刻运行,因此应该进行防御性编码。特别是,它们应该写成线程安全的,并尽可能避免死锁。他们也不应该盲目依赖可能已经注册了自己的关闭钩子的服务,因此他们自己可能正在关闭的过程中。例如,尝试使用其他基于线程的服务(例如 AWT 事件调度线程)可能会导致死锁。
关闭挂钩也应该快速完成它们的工作。当程序调用 exit 时,期望虚拟机将立即关闭并退出。当虚拟机由于用户注销或系统关闭而终止时,底层操作系统可能只允许关闭和退出的固定时间量。因此,不建议尝试任何用户交互或在关闭挂钩中执行长时间运行的计算。
与在任何其他线程中一样,通过调用线程的 ThreadGroup 对象的 ThreadGroup#uncaughtException 方法,在关闭挂钩中处理未捕获的异常。此方法的默认实现将异常的堆栈跟踪打印到 System#err 并终止线程;它不会导致虚拟机退出或停止。
在极少数情况下,虚拟机可能会中止,即在没有完全关闭的情况下停止运行。当虚拟机在外部终止时会发生这种情况,例如在 Unix 上使用 SIGKILL 信号或在 Microsoft Windows 上使用 TerminateProcess 调用。如果本地方法出错,例如破坏内部数据结构或尝试访问不存在的内存,虚拟机也可能中止。如果虚拟机中止,则无法保证是否会运行任何关闭挂钩。
参数:
参数名称 | 参数描述 |
---|---|
hook | 一个已初始化但未启动的 Thread 对象 |
Throws:
Throw名称 | Throw描述 |
---|---|
IllegalArgumentException | 如果指定的钩子已经注册,或者是否可以确定钩子已经运行或者已经运行 |
IllegalStateException | 如果虚拟机已经处于关闭过程中 |
SecurityException | 如果存在安全管理器并且它拒绝 RuntimePermission("shutdownHooks") |
removeShutdownHook
public boolean removeShutdownHook(Thread hook)
取消注册以前注册的虚拟机关闭挂钩。
参数:
参数名称 | 参数描述 |
---|---|
hook | 要移除的钩子 |
返回:
如果指定的钩子先前已注册并成功取消注册,则为 true,否则为 false。
Throws:
Throw名称 | Throw描述 |
---|---|
IllegalStateException | 如果虚拟机已经处于关闭过程中 |
SecurityException | 如果存在安全管理器并且它拒绝 RuntimePermission("shutdownHooks") |
halt
public void halt(int status)
强制终止当前运行的 Java 虚拟机。 此方法永远不会正常返回。
使用此方法时应格外小心。 与 exit 方法不同,如果 finalization-on-exit 已启用,此方法不会导致关闭挂钩启动并且不会运行未调用的终结器。 如果已启动关闭序列,则此方法不会等待任何正在运行的关闭挂钩或终结器完成其工作。
参数:
参数名称 | 参数描述 |
---|---|
status | 终止状态。 按照惯例,非零状态码表示异常终止。 如果 Runtime#exit(等效于 System#exit(int))方法已被调用,则此状态代码将覆盖传递给该方法的状态代码。 |
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果存在安全管理器并且其 SecurityManager#checkExit 方法不允许以指定状态退出 |
runFinalizersOnExit
@Deprecated public static void runFinalizersOnExit(boolean value)
已弃用。 这种方法本质上是不安全的。 这可能会导致在其他线程同时操作这些对象时对活动对象调用终结器,从而导致行为不稳定或死锁。
在退出时启用或禁用终结; 这样做指定在 Java 运行时退出之前运行具有尚未自动调用的终结器的所有对象的终结器。 默认情况下,退出时的最终确定是禁用的。
如果存在安全管理器,则首先调用其 checkExit 方法,并以 0 作为其参数,以确保允许退出。 这可能会导致 SecurityException。
参数:
参数名称 | 参数描述 |
---|---|
value | true 在退出时启用最终确定,false 禁用 |
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果存在安全管理器并且其 checkExit 方法不允许退出。 |
exec
public Process exec(String command) throws IOException
在单独的进程中执行指定的字符串命令。
这是一种方便的方法。 调用 exec(command) 形式的行为与调用 exec(command, null, null) 完全相同。
参数:
参数名称 | 参数描述 |
---|---|
command | 指定的系统命令。 |
返回:
用于管理子流程的新流程对象
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果存在安全管理器并且其 SecurityManager#checkExec 方法不允许创建子进程 |
IOException | 如果发生 I/O 错误 |
NullPointerException | 如果命令为 null |
IllegalArgumentException | 如果命令为empty |
exec
public Process exec(String command, String[] envp) throws IOException
在具有指定环境的单独进程中执行指定的字符串命令。
这是一种方便的方法。 exec(command, envp) 形式的调用与调用 exec(command, envp, null) 的行为方式完全相同。
参数:
参数名称 | 参数描述 |
---|---|
command | 指定的系统命令。 |
envp | 字符串数组,其中每个元素都具有格式 name=value 的环境变量设置,如果子进程应继承当前进程的环境,则为 null。 |
返回:
用于管理子流程的新流程对象
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果存在安全管理器并且其 SecurityManager#checkExec 方法不允许创建子进程 |
IOException | 如果发生 I/O 错误 |
NullPointerException | 如果 command 为 null,或者 envp 的元素之一为 null |
IllegalArgumentException | 如果命令为empty |
exec
public Process exec(String command, String[] envp, File dir) throws IOException
在具有指定环境和工作目录的单独进程中执行指定的字符串命令。
这是一种方便的方法。 exec(command, envp, dir) 形式的调用与调用 exec(cmdarray, envp, dir) 的行为方式完全相同,其中 cmdarray 是命令中所有标记的数组。
更准确地说,使用由调用 new StringTokenizer(command) 创建的 StringTokenizer 将命令字符串分解为标记,而无需进一步修改字符类别。 标记器生成的标记然后以相同的顺序放置在新的字符串数组 cmdarray 中。
参数:
参数名称 | 参数描述 |
---|---|
command | 指定的系统命令。 |
envp | 字符串数组,其中每个元素都具有格式 name=value 的环境变量设置,如果子进程应继承当前进程的环境,则为 null。 |
dir | 子进程的工作目录,如果子进程应该继承当前进程的工作目录,则返回 null。 |
返回:
用于管理子流程的新流程对象
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果存在安全管理器并且其 SecurityManager#checkExec 方法不允许创建子进程 |
IOException | 如果发生 I/O 错误 |
NullPointerException | 如果 command 为 null,或者 envp 的元素之一为 null |
IllegalArgumentException | 如果命令为empty |
exec
public Process exec(String[] cmdarray) throws IOException
在单独的进程中执行指定的命令和参数。
这是一种方便的方法。 exec(cmdarray) 形式的调用与调用 exec(cmdarray, null, null) 的行为方式完全相同。
参数:
参数名称 | 参数描述 |
---|---|
cmdarray | 包含要调用的命令及其参数的数组。 |
返回:
用于管理子流程的新流程对象
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果存在安全管理器并且其 SecurityManager#checkExec 方法不允许创建子进程 |
IOException | 如果发生 I/O 错误 |
NullPointerException | 如果 cmdarray 为 null,或者 cmdarray 的元素之一为 null |
IndexOutOfBoundsException | 如果 cmdarray 是一个空数组(长度为 0) |
exec
public Process exec(String[] cmdarray, String[] envp) throws IOException
在具有指定环境的单独进程中执行指定的命令和参数。
这是一种方便的方法。 exec(cmdarray, envp) 形式的调用与调用 exec(cmdarray, envp, null) 的行为方式完全相同。
参数:
参数名称 | 参数描述 |
---|---|
cmdarray | 包含要调用的命令及其参数的数组。 |
envp | 字符串数组,其中每个元素都具有格式 name=value 的环境变量设置,如果子进程应继承当前进程的环境,则为 null。 |
返回:
用于管理子流程的新流程对象
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果存在安全管理器并且其 SecurityManager#checkExec 方法不允许创建子进程 |
IOException | 如果发生 I/O 错误 |
NullPointerException | 如果 cmdarray 为 null,或者 cmdarray 的元素之一为 null,或者 envp 的元素之一为 null |
IndexOutOfBoundsException | 如果 cmdarray 是一个空数组(长度为 0) |
exec
public Process exec(String[] cmdarray, String[] envp, File dir) throws IOException
在具有指定环境和工作目录的单独进程中执行指定的命令和参数。
给定一个字符串数组 cmdarray,表示命令行的标记,和一个字符串数组 envp,表示“环境”变量设置,这个方法创建一个新进程来执行指定的命令。
此方法检查 cmdarray 是否为有效的操作系统命令。哪些命令有效取决于系统,但至少该命令必须是非空字符串的非空列表。
如果 envp 为 null,则子进程继承当前进程的环境设置。
在某些操作系统上启动进程可能需要一组最小的系统相关环境变量。因此,子进程可能会继承指定环境之外的其他环境变量设置。
ProcessBuilder#start() 现在是使用修改后的环境启动进程的首选方式。
新子进程的工作目录由 dir 指定。如果 dir 为 null,则子进程继承当前进程的当前工作目录。
如果存在安全管理器,则使用数组 cmdarray 的第一个组件作为其参数调用其 SecurityManager#checkExec 方法。这可能会导致抛出 SecurityException。
启动操作系统进程高度依赖于系统。可能出错的许多事情包括:
- 找不到操作系统程序文件。
- 访问程序文件被拒绝。
- 工作目录不存在。
在这种情况下会抛出异常。 异常的确切性质取决于系统,但它始终是 IOException 的子类。
参数:
参数名称 | 参数描述 |
---|---|
cmdarray | 包含要调用的命令及其参数的数组。 |
envp | 字符串数组,其中每个元素的环境变量设置格式为 name=value,如果子进程应继承当前进程的环境,则为 null。 |
dir | 子进程的工作目录,如果子进程应该继承当前进程的工作目录,则返回 null。 |
返回:
用于管理子流程的新流程对象
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果存在安全管理器并且其 SecurityManager#checkExec 方法不允许创建子进程 |
IOException | 如果发生 I/O 错误 |
NullPointerException | 如果 cmdarray 为 null,或者 cmdarray 的元素之一为 null,或者 envp 的元素之一为 null |
IndexOutOfBoundsException | 如果 cmdarray 是一个空数组(长度为 0) |
availableProcessors
public int availableProcessors()
返回 Java 虚拟机可用的处理器数量。
此值可能会在虚拟机的特定调用期间发生变化。 因此,对可用处理器数量敏感的应用程序应偶尔轮询此属性并适当调整其资源使用情况。
返回:
虚拟机可用的最大处理器数量; 从不小于一
freeMemory
public long freeMemory()
返回 Java 虚拟机中的可用内存量。 调用 gc 方法可能会导致 freeMemory 返回的值增加。
返回:
当前可用于未来分配的对象的内存总量的近似值,以字节为单位。
totalMemory
public long totalMemory()
返回 Java 虚拟机中的内存总量。 此方法返回的值可能会随时间变化,具体取决于主机环境。
请注意,保存任何给定类型的对象所需的内存量可能取决于实现。
返回:
当前可用于当前和未来对象的内存总量,以字节为单位。
maxMemory
public long maxMemory()
返回 Java 虚拟机将尝试使用的最大内存量。 如果没有固有限制,则返回 Long.MAX_VALUE 值。
返回:
虚拟机将尝试使用的最大内存量,以字节为单位
gc
public void gc()
运行垃圾收集器。 调用此方法表明 Java 虚拟机花费精力回收未使用的对象,以使它们当前占用的内存可用于快速重用。 当控制从方法调用返回时,虚拟机已尽最大努力回收所有丢弃的对象。
gc 这个名字代表“垃圾收集器”。 虚拟机根据需要在单独的线程中自动执行此回收过程,即使没有显式调用 gc 方法。
System#gc() 方法是调用此方法的常规且方便的方法。
runFinalization
public void runFinalization()
运行任何等待终结的对象的终结方法。 调用此方法表明 Java 虚拟机花费精力运行已发现已丢弃但尚未运行其 finalize 方法的对象的 finalize 方法。 当控制从方法调用返回时,虚拟机已尽最大努力完成所有未完成的终结。
如果未显式调用 runFinalization 方法,则虚拟机会根据需要在单独的线程中自动执行终结过程。
System#runFinalization() 方法是调用此方法的常规且方便的方法。
traceInstructions
public void traceInstructions(boolean on)
启用/禁用指令跟踪。 如果布尔参数为真,则此方法建议 Java 虚拟机在执行时为虚拟机中的每条指令发出调试信息。 此信息的格式以及将其发送到的文件或其他输出流取决于主机环境。 如果虚拟机不支持此功能,它可能会忽略此请求。 跟踪输出的目的地取决于系统。
如果布尔参数为假,此方法会导致虚拟机停止执行它正在执行的详细指令跟踪。
参数:
参数名称 | 参数描述 |
---|---|
on | true 启用指令跟踪; false 禁用此功能。 |
traceMethodCalls
public void traceMethodCalls(boolean on)
启用/禁用方法调用的跟踪。 如果布尔参数为真,则此方法建议 Java 虚拟机在调用虚拟机时为虚拟机中的每个方法发出调试信息。 此信息的格式以及将其发送到的文件或其他输出流取决于主机环境。 如果虚拟机不支持此功能,它可能会忽略此请求。
使用参数 false 调用此方法表明虚拟机停止发出每次调用的调试信息。
参数:
参数名称 | 参数描述 |
---|---|
on | true 启用指令跟踪; false 禁用此功能。 |
load
public void load(String filename)
加载由文件名参数指定的本机库。文件名参数必须是绝对路径名。 (例如 Runtime.getRuntime().load("/home/avh/lib/libX11.so");)。如果 filename 参数在去除任何特定于平台的库前缀、路径和文件扩展名后,指示名称为 L 的库,并且名为 L 的本机库与 VM 静态链接,则 JNI_OnLoad_L 函数调用由库导出的,而不是尝试加载动态库。与参数匹配的文件名不必存在于文件系统中。有关更多详细信息,请参阅 JNI 规范。否则,文件名参数以与实现相关的方式映射到本机库映像。
首先,如果有一个安全管理器,它的 checkLink 方法以文件名作为它的参数被调用。这可能会导致安全异常。
这类似于方法 loadLibrary(java.lang.String),但它接受一个通用文件名作为参数,而不仅仅是一个库名,允许加载任何本地代码文件。
System#load(String) 方法是调用此方法的常规且方便的方法。
参数:
参数名称 | 参数描述 |
---|---|
filename | 要加载的文件。 |
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果存在安全管理器并且其 checkLink 方法不允许加载指定的动态库 |
UnsatisfiedLinkError | 如果文件名不是绝对路径名,则本机库未与 VM 静态链接,或者主机系统无法将库映射到本机库映像。 |
NullPointerException | 如果文件名为空 |
loadLibrary
public void loadLibrary(String libname)
加载由 libname 参数指定的本机库。 libname 参数不得包含任何特定于平台的前缀、文件扩展名或路径。 如果名为 libname 的本机库与 VM 静态链接,则调用该库导出的 JNI_OnLoad_libname 函数。 有关更多详细信息,请参阅 JNI 规范。 否则,libname 参数将从系统库位置加载并以与实现相关的方式映射到本机库映像。
首先,如果有一个安全管理器,它的 checkLink 方法会以 libname 作为参数调用。 这可能会导致安全异常。
System#loadLibrary(String) 方法是调用此方法的常规且方便的方法。 如果要在类的实现中使用本地方法,标准策略是将本地代码放入库文件(称为 LibFile)中,然后放入静态初始化程序:
static { System.loadLibrary("LibFile"); }
在类声明中。 当类被加载和初始化时,本地方法的必要本地代码实现也将被加载。
如果使用相同的库名称多次调用此方法,则忽略第二次和后续调用。
参数:
参数名称 | 参数描述 |
---|---|
libname | 库的名称。 |
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果存在安全管理器并且其 checkLink 方法不允许加载指定的动态库 |
UnsatisfiedLinkError | 如果 libname 参数包含文件路径,则本机库未与 VM 静态链接,或者该库无法由主机系统映射到本机库映像。 |
NullPointerException | 如果 libname 为空 |
getLocalizedInputStream
@Deprecated public InputStream getLocalizedInputStream(InputStream in)
已弃用。 从 JDK 1.1 开始,将本地编码中的字节流转换为 Unicode 中的字符流的首选方法是通过 InputStreamReader 和 BufferedReader 类。
创建输入流的本地化版本。 此方法接受一个 InputStream 并返回一个在所有方面都与参数等效的 InputStream,除了它是本地化的:当从流中读取本地字符集中的字符时,它们会自动从本地字符集转换为 Unicode。
如果参数已经是本地化流,则可以将其作为结果返回。
参数:
参数名称 | 参数描述 |
---|---|
in | InputStream 进行本地化 |
返回:
本地化输入流
getLocalizedOutputStream
@Deprecated public OutputStream getLocalizedOutputStream(OutputStream out)
已弃用。 从 JDK 1.1 开始,将 Unicode 字符流转换为本地编码的字节流的首选方法是通过 OutputStreamWriter、BufferedWriter 和 PrintWriter 类。
创建输出流的本地化版本。 此方法接受一个 OutputStream 并返回一个在所有方面都与参数等效的 OutputStream,除了它是本地化的:当 Unicode 字符写入流时,它们会自动转换为本地字符集。
如果参数已经是本地化流,则可以将其作为结果返回。
参数:
参数名称 | 参数描述 |
---|---|
out | OutputStream 进行本地化 |
返回:
本地化的输出流