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