深入研究java.lang.Runtime類【轉】

?

轉自:http://blog.csdn.net/lastsweetop/article/details/3961911

目錄(?)[-]

  1. javalang 類 Runtime
    1. getRuntime
    2. exit
    3. addShutdownHook
    4. removeShutdownHook
    5. halt
    6. runFinalizersOnExit
    7. exec
    8. exec
    9. exec
    10. exec
    11. exec
    12. exec
    13. availableProcessors
    14. freeMemory
    15. totalMemory
    16. maxMemory
    17. gc
    18. runFinalization
    19. traceInstructions
    20. traceMethodCalls
    21. load
    22. loadLibrary
    23. getLocalizedInputStream
    24. getLocalizedOutputStream

?

前言:Java的類庫日益龐大,所包含的類和接口也不計其數。但其中有一些非常重要的類和接口,是Java類庫中的核心部分。常見的有String、Object、Class、Collection、ClassLoader、Runtime、Process...,熟悉這些類是學好Java的基礎。而這些類一般不容易理解,需要做深入的研究和實踐才能掌握。下面是我對這些類理解和使用的一些總結。歡迎你在閱讀后將你寶貴的意見和讀后感留下!

?

一、概述
????? Runtime類封裝了運行時的環境。每個 Java 應用程序都有一個 Runtime 類實例,使應用程序能夠與其運行的環境相連接。
????? 一般不能實例化一個Runtime對象,應用程序也不能創建自己的 Runtime 類實例,但可以通過 getRuntime 方法獲取當前Runtime運行時對象的引用。
????? 一旦得到了一個當前的Runtime對象的引用,就可以調用Runtime對象的方法去控制Java虛擬機的狀態和行為。?
????? 當Applet和其他不被信任的代碼調用任何Runtime方法時,常常會引起SecurityException異常。

?

二、API預覽
??? addShutdownHook(Thread hook)?
????? 注冊新的虛擬機來關閉掛鉤。?
??? availableProcessors()?
????? 向 Java 虛擬機返回可用處理器的數目。?
??? exec(String command)?
????? 在單獨的進程中執行指定的字符串命令。?
??? exec(String[] cmdarray)?
????? 在單獨的進程中執行指定命令和變量。?
??? exec(String[] cmdarray, String[] envp)?
????? 在指定環境的獨立進程中執行指定命令和變量。?
??? exec(String[] cmdarray, String[] envp, File dir)?
????? 在指定環境和工作目錄的獨立進程中執行指定的命令和變量。?
??? exec(String command, String[] envp)?
????? 在指定環境的單獨進程中執行指定的字符串命令。?
??? exec(String command, String[] envp, File dir)?
????? 在有指定環境和工作目錄的獨立進程中執行指定的字符串命令。?
??? exit(int status)?
????? 通過啟動虛擬機的關閉序列,終止當前正在運行的 Java 虛擬機。?
??? freeMemory()?
????? 返回 Java 虛擬機中的空閑內存量。?
??? gc()?
????? 運行垃圾回收器。?
??? InputStream getLocalizedInputStream(InputStream in)?
????? 已過時。 從 JDK 1.1 開始,將本地編碼字節流轉換為 Unicode 字符流的首選方法是使用 InputStreamReader 和 BufferedReader 類。?
??? OutputStream getLocalizedOutputStream(OutputStream out)?
????? 已過時。 從 JDK 1.1 開始,將 Unicode 字符流轉換為本地編碼字節流的首選方法是使用 OutputStreamWriter、BufferedWriter 和 PrintWriter 類。?
??? getRuntime()?
????? 返回與當前 Java 應用程序相關的運行時對象。?
??? halt(int status)?
????? 強行終止目前正在運行的 Java 虛擬機。?
??? load(String filename)?
????? 加載作為動態庫的指定文件名。?
??? loadLibrary(String libname)?
????? 加載具有指定庫名的動態庫。?
??? maxMemory()?
????? 返回 Java 虛擬機試圖使用的最大內存量。?
??? removeShutdownHook(Thread hook)?
????? 取消注冊某個先前已注冊的虛擬機關閉掛鉤。?
??? runFinalization()?
????? 運行掛起 finalization 的所有對象的終止方法。?
??? runFinalizersOnExit(value)?
????? 已過時。 此方法本身具有不安全性。它可能對正在使用的對象調用終結方法,而其他線程正在操作這些對象,從而導致不正確的行為或死鎖。?
??? totalMemory()?
????? 返回 Java 虛擬機中的內存總量。?
??? traceInstructions(on)?
????? 啟用/禁用指令跟蹤。?
??? traceMethodCalls(on)?
????? 啟用/禁用方法調用跟蹤。

?

三、常見的應用

1、內存管理:
Java提供了無用單元自動收集機制。通過totalMemory()和freeMemory()方法可以知道對象的堆內存有多大,還剩多少。
Java會周期性的回收垃圾對象(未使用的對象),以便釋放內存空間。但是如果想先于收集器的下一次指定周期來收集廢棄的對象,可以通過調用gc()方法來根據需要運行無用單元收集器。一個很好的試驗方法是先調用gc()方法,然后調用freeMemory()方法來查看基本的內存使用情況,接著執行代碼,然后再次調用freeMemory()方法看看分配了多少內存。下面的程序演示了這個構想。

//此實例來自《java核心技術》卷一
class MemoryDemo{
??? public static void main(String args[]){
??????? Runtime r = Runtime.getRuntime();
??????? long mem1,mem2;
??????? Integer someints[] = new Integer[1000];
??????? System.out.println("Total memory is :" + r.totalMemory());
??????? mem1 = r.freeMemory();
??????? System.out.println("Initial free is : " + mem1);
??????? r.gc();
??????? mem1 = r.freeMemory();
??????? System.out.println("Free memory after garbage collection : " + mem1);
??????? //allocate integers
??????? for(int i=0; i<1000; i++) someints[i] = new Integer(i);

??????? mem2 = r.freeMemory();
??????? System.out.println("Free memory after allocation : " + mem2);
??????? System.out.println("Memory used by allocation : " +(mem1-mem2));

??????? //discard Intergers
??????? for(int i=0; i<1000; i++) someints[i] = null;
??????? r.gc(); //request garbage collection
??????? mem2 = r.freeMemory();
??????? System.out.println("Free memory after collecting " + "discarded integers : " + mem2);
??? }
}

編譯后運行結果如下(不同的機器不同時間運行的結果也不一定一樣):
Total memory is :2031616
Initial free is : 1818488
Free memory after garbage collection : 1888808
Free memory after allocation : 1872224
Memory used by allocation : 16584
Free memory after collecting discarded integers : 1888808

?

2、執行其他程序
在安全的環境中,可以在多任務操作系統中使用Java去執行其他特別大的進程(也就是程序)。ecec()方法有幾種形式命名想要運行的程序和它的輸入參數。ecec()方法返回一個Process對象,可以使用這個對象控制Java程序與新運行的進程進行交互。ecec()方法本質是依賴于環境。
下面的例子是使用ecec()方法啟動windows的記事本notepad。這個例子必須在Windows操作系統上運行。

//此實例來自《Java核心技術》卷一
class ExecDemo {
??? public static void main(String args[]){
??????? Runtime r = Runtime.getRuntime();
??????? Process p = null;
??????? try{
??????????? p = r.exec("notepad");
??????? } catch (Exception e) {
??????????? System.out.println("Error executing notepad.");
??????? }
??? }
}

ecec()還有其他幾種形式,例子中演示的是最常用的一種。ecec()方法返回Process對象后,在新程序開始運行后就可以使用Process的方法了。可以用destory()方法殺死子進程,也可以使用waitFor()方法等待程序直到子程序結束,exitValue()方法返回子進程結束時返回的值。如果沒有錯誤,將返回0,否則返回非0。下面是關于ecec()方法的例子的改進版本。例子被修改為等待,直到運行的進程退出:

//此實例來自《Java核心技術》卷一
class ExecDemoFini {
??? public static void main(String args[]){
??????? Runtime r = Runtime.getRuntime();
??????? Process p = null;
??????? try{
??????????? p = r.exec("notepad");
??????????? p.waitFor();
??????? } catch (Exception e) {
??????????? System.out.println("Error executing notepad.");
??????? }
??????? System.out.println("Notepad returned " + p.exitValue());
??? }
}
下面是運行的結果(當關閉記事本后,會接著運行程序,打印信息):
Notepad returned 0
請按任意鍵繼續. . .

?

當子進程正在運行時,可以對標準輸入輸出進行讀寫。getOutputStream()方法和getInPutStream()方法返回對子進程的標準輸入和輸出。


四、來自SUN公司的java.long.Runtime類的API文檔,網上有chm中文版的,很好找。為了查閱方便,我從SUN公司的JavaDoc站點上復制出來了Runtime類的API文檔。

java.lang?
類 Runtime

java.lang.Object
java.lang.Runtime

public class Runtimeextends Object

每個 Java 應用程序都有一個?Runtime?類實例,使應用程序能夠與其運行的環境相連接。可以通過?getRuntime?方法獲取當前運行時。

應用程序不能創建自己的 Runtime 類實例。

?

?

從以下版本開始:
JDK1.0
另請參見:
getRuntime()

方法摘要
?voidaddShutdownHook(Thread?hook)?
??????????注冊新的虛擬機來關閉掛鉤。
?intavailableProcessors()?
??????????向 Java 虛擬機返回可用處理器的數目。
?Processexec(String?command)?
??????????在單獨的進程中執行指定的字符串命令。
?Processexec(String[]?cmdarray)?
??????????在單獨的進程中執行指定命令和變量。
?Processexec(String[]?cmdarray,?String[]?envp)?
??????????在指定環境的獨立進程中執行指定命令和變量。
?Processexec(String[]?cmdarray,?String[]?envp,?File?dir)?
??????????在指定環境和工作目錄的獨立進程中執行指定的命令和變量。
?Processexec(String?command,?String[]?envp)?
??????????在指定環境的單獨進程中執行指定的字符串命令。
?Processexec(String?command,?String[]?envp,?File?dir)?
??????????在有指定環境和工作目錄的獨立進程中執行指定的字符串命令。
?voidexit(int?status)?
??????????通過啟動虛擬機的關閉序列,終止當前正在運行的 Java 虛擬機。
?longfreeMemory()?
??????????返回 Java 虛擬機中的空閑內存量。
?voidgc()?
??????????運行垃圾回收器。
?InputStreamgetLocalizedInputStream(InputStream?in)?
??????????已過時。?從 JDK?1.1 開始,將本地編碼字節流轉換為 Unicode 字符流的首選方法是使用?InputStreamReader?和?BufferedReader類。
?OutputStreamgetLocalizedOutputStream(OutputStream?out)?
??????????已過時。?從 JDK?1.1 開始,將 Unicode 字符流轉換為本地編碼字節流的首選方法是使用?OutputStreamWriterBufferedWriter和?PrintWriter?類。
static?RuntimegetRuntime()?
??????????返回與當前 Java 應用程序相關的運行時對象。
?voidhalt(int?status)?
??????????強行終止目前正在運行的 Java 虛擬機。
?voidload(String?filename)?
??????????加載作為動態庫的指定文件名。
?voidloadLibrary(String?libname)?
??????????加載具有指定庫名的動態庫。
?longmaxMemory()?
??????????返回 Java 虛擬機試圖使用的最大內存量。
?booleanremoveShutdownHook(Thread?hook)?
??????????取消注冊某個先前已注冊的虛擬機關閉掛鉤。
?voidrunFinalization()?
??????????運行掛起 finalization 的所有對象的終止方法。
static?voidrunFinalizersOnExit(boolean?value)?
??????????已過時。?此方法本身具有不安全性。它可能對正在使用的對象調用終結方法,而其他線程正在操作這些對象,從而導致不正確的行為或死鎖。
?longtotalMemory()?
??????????返回 Java 虛擬機中的內存總量。
?voidtraceInstructions(boolean?on)?
??????????啟用/禁用指令跟蹤。
?voidtraceMethodCalls(boolean?on)?
??????????啟用/禁用方法調用跟蹤。
?
從類 java.lang.Object?繼承的方法
clone,?equals,?finalize,?getClass,?hashCode,?notify,?notifyAll,?toString,?wait,?wait,?wait
?

方法詳細信息

getRuntime

public static Runtime getRuntime()
返回與當前 Java 應用程序相關的運行時對象。Runtime?類的大多數方法是實例方法,并且必須根據當前的運行時對象對其進行調用。

?

返回:
與當前 Java 應用程序相關的?Runtime?對象。

exit

public void exit(int?status)
通過啟動虛擬機的關閉序列,終止當前正在運行的 Java 虛擬機。此方法從不正常返回。可以將變量作為一個狀態碼;根據慣例,非零的狀態碼表示非正常終止。

虛擬機的關閉序列包含兩個階段。在第一個階段中,會以某種未指定的順序啟動所有已注冊的關閉掛鉤(如果有的話),并且允許它們同時運行直至結束。在第二個階段中,如果已啟用退出終結,則運行所有未調用的終結方法。一旦完成這個階段,虛擬機就會暫停

如果在虛擬機已開始其關閉序列后才調用此方法,那么若正在運行關閉掛鉤,則將無限期地阻斷此方法。如果已經運行完關閉掛鉤,并且已啟用退出終結 (on-exit finalization),那么此方法將利用給定的狀態碼(如果狀態碼是非零值)暫停虛擬機;否則將無限期地阻斷虛擬機。

System.exit?方法是調用此方法的一種傳統而便捷的方式。

?

?

參數:
status?- 終止狀態。按照慣例,非零的狀態碼表明非正常終止。
拋出:
SecurityException?- 如果安全管理器存在,并且其?checkExit?方法不允許存在指定的狀態
另請參見:
SecurityException,?SecurityManager.checkExit(int),?addShutdownHook(java.lang.Thread),?removeShutdownHook(java.lang.Thread),runFinalizersOnExit(boolean),?halt(int)

addShutdownHook

public void addShutdownHook(Thread?hook)
注冊新的虛擬機來關閉掛鉤。

Java 虛擬機會為了響應以下兩類事件而關閉

?

  • 程序正常退出,這發生在最后的非守護線程退出時,或者在調用?exit(等同于System.exit)方法時。或者,

    ?

  • 為響應用戶中斷而終止?虛擬機,如鍵入?^C;或發生系統事件,比如用戶注銷或系統關閉。

關閉掛鉤?只是一個已初始化但尚未啟動的線程。虛擬機開始啟用其關閉序列時,它會以某種未指定的順序啟動所有已注冊的關閉掛鉤,并讓它們同時運行。運行完所有的掛鉤后,如果已啟用退出終結,那么虛擬機接著會運行所有未調用的終結方法。最后,虛擬機會暫停。注意,關閉序列期間會繼續運行守護線程,如果通過調用?exit?方法來發起關閉序列,那么也會繼續運行非守護線程。

一旦開始了關閉序列,則只能通過調用?halt?方法來停止這個序列,此方法可強行終止虛擬機。

一旦開始了關閉序列,則不可能注冊新的關閉掛鉤或取消注冊先前已注冊的掛鉤。嘗試執行這些操作會導致拋出?IllegalStateException

關閉掛鉤可在虛擬機生命周期中的特定時間運行,因此應保護性地對其進行編碼。特別是應將關閉掛鉤編寫為線程安全的,并盡可能地避免死鎖。關閉掛鉤還應該不盲目地依靠某些服務,這些服務可能已注冊了自己的關閉掛鉤,所以其本身可能正處于關閉進程中。

關閉掛鉤應該快速地完成其工作。當程序調用?exit?時,虛擬機應該迅速地關閉并退出。由于用戶注銷或系統關閉而終止虛擬機時,底層的操作系統可能只允許在固定的時間內關閉并退出。因此在關閉掛鉤中嘗試進行任何用戶交互或執行長時間的計算都是不明智的。

與其他所有線程一樣,通過調用線程?ThreadGroup?對象的?uncaughtException?方法,可在關閉掛鉤中處理未捕獲的異常。此方法的默認實現是將該異常的堆棧跟蹤 (stack trace) 打印至?System.err?并終止線程;它不會導致虛擬機退出或暫停。

僅在很少的情況下,虛擬機可能會中止,也就是沒有完全關閉就停止運行。虛擬機被外部終止時會出現這種現象,比如在 Unix 上使用?SIGKILL?信號或者在 Microsoft Windows 上調用?TerminateProcess。如果由于內部數據結構損壞或試圖訪問不存在的內存而導致本機方法執行錯誤,那么可能也會中止虛擬機。如果虛擬機中止,則無法保證是否將運行關閉掛鉤。

?

?

參數:
hook?- 一個已初始化但尚未啟動的?Thread?對象
拋出:
IllegalArgumentException?- 如果指定的掛鉤已注冊,或者可以確定掛鉤正在運行或者已運行完畢
IllegalStateException?- 如果虛擬機已經處于關閉進程中
SecurityException?- 如果安全管理器存在并且拒絕?RuntimePermission("shutdownHooks")
從以下版本開始:
1.3
另請參見:
removeShutdownHook(java.lang.Thread),?halt(int),?exit(int)

removeShutdownHook

public boolean removeShutdownHook(Thread?hook)
取消注冊某個先前已注冊的虛擬機關閉掛鉤。

?

?

參數:
hook?- 要刪除的掛鉤
返回:
如果指定的掛鉤先前已注冊并且成功地取消注冊,則返回?true,其他情況返回?false
拋出:
IllegalStateException?- 如果虛擬機已經處于關閉進程中
SecurityException?- 如果安全管理器存在并且拒絕?RuntimePermission("shutdownHooks")
從以下版本開始:
1.3
另請參見:
addShutdownHook(java.lang.Thread),?exit(int)

halt

public void halt(int?status)
強行終止目前正在運行的 Java 虛擬機。此方法從不正常返回。

應小心使用此方法。與?exit?方法不同,此方法不會啟動關閉掛鉤,并且如果已啟用退出終結,此方法也不會運行未調用的終結方法。如果已經發起關閉序列,那么此方法不會等待所有正在運行的關閉掛鉤或終結方法完成其工作。

?

?

參數:
status?- 終止狀態。按照慣例,非零的狀態碼表明非正常終止。如果已經調用了?exitSystem.exit?也一樣)方法,那么該狀態碼將重寫已傳遞至此方法的狀態碼。
拋出:
SecurityException?- 如果安全管理器存在,并且其?checkExit?方法不允許具有指定狀態時退出
從以下版本開始:
1.3
另請參見:
exit(int),?addShutdownHook(java.lang.Thread),?removeShutdownHook(java.lang.Thread)

runFinalizersOnExit

@Deprecated
public static void runFinalizersOnExit(boolean?value)
已過時。?此方法本身具有不安全性。它可能對正在使用的對象調用終結方法,而其他線程正在操作這些對象,從而導致不正確的行為或死鎖。

?

在退出時啟用或禁用終結;這樣做可指定擁有未被自動調用終結方法的所有對象的終結方法,并將在退出 Java 運行時前運行此終結方法。默認情況下,禁用退出終結。

如果有安全管理器,則首先使用 0 作為變量來調用其?checkExit?方法,以確保允許退出。這可能會導致 SecurityException。

?

參數:
value?- 如果啟用退出時終結,則該參數為 true,如果禁用退出時終結,則該參數為 false
拋出:
SecurityException?- 如果安全管理器存在并且其?checkExit?方法不允許退出。
從以下版本開始:
JDK1.1
另請參見:
exit(int),?gc(),?SecurityManager.checkExit(int)

exec

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

exec

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

exec

public Process exec(String?command,String[]?envp,File?dir)throws IOException
在有指定環境和工作目錄的獨立進程中執行指定的字符串命令。

這是一個很有用的方法。對于?exec(command, envp, dir)?形式的調用而言,其行為與調用?exec(cmdarray, envp, dir)?完全相同,其中?cmdarray是?command?中所有標記的數組。

更準確地說,可以使用通過調用?new?StringTokenizer(command)?創建的?StringTokenizer?將?command?字符串拆解成標記,調用時不對字符類別做進一步的修改。然后將標記生成器所生成的標記以相同的順序放入新的字符串數組?cmdarray?中。

?

參數:
command?- 一條指定的系統命令。
envp?- 字符串數組,其中每個元素的環境變量的設置格式為?name=value;如果子進程應該繼承當前進程的環境,或該參數為?null
dir?- 子進程的工作目錄;如果子進程應該繼承當前進程的工作目錄,則該參數為?null
返回:
一個新的?Process?對象,用于管理子進程
拋出:
SecurityException?- 如果安全管理器存在,并且其?checkExec?方法不允許創建子進程
IOException?- 如果發生 I/O 錯誤
NullPointerException?- 如果?command?為?null,或者?envp?的某個元素為?null
IllegalArgumentException?- 如果?command?為空
從以下版本開始:
1.3
另請參見:
ProcessBuilder

exec

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

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?- 如果?cmdarray?為?null,或者?cmdarray?的某個元素為?null,或者?envp?的某個元素為?null
IndexOutOfBoundsException?- 如果?cmdarray?是一個空數組(長度為?0
另請參見:
ProcessBuilder

exec

public Process exec(String[]?cmdarray,String[]?envp,File?dir)throws IOException
在指定環境和工作目錄的獨立進程中執行指定的命令和變量。

給定的字符串數組?cmdarray?表示一個命令行標記,字符串數組?envp?則表示“環境”變量設置,此方法會創建一個新進程,而指定的命令就在這個進程中執行。

此方法檢查?cmdarray?是否是一條有效的操作系統命令。哪些命令有效取決于系統,但是該命令至少必須有一個非 null 字符串的非空列表。

如果?envp?為?null,那么子進程會繼承當前進程的環境設置。

ProcessBuilder.start()?現在是啟用一個具有已修改環境的進程的首選方法。

dir?指定了新子進程的工作目錄。如果?dir?為?null,那么子進程會繼承當前進程的當前工作目錄。

如果安全管理器存在,則用數組?cmdarray?的第一個元素作為變量來調用安全管理器的?checkExec?方法。這可能導致拋出?SecurityException

啟動操作系統進程的方式完全取決于系統。其中有很多方面會導致錯誤:

  • 未找到操作系統程序文件。
  • 對程序文件的訪問被拒絕。
  • 工作目錄不存在。

這些情況都會拋出一個異常。該異常的具體特性取決于系統,但它總是?IOException?的一個子類。

?

參數:
cmdarray?- 包含所調用命令及其參數的數組。
envp?- 字符串數組,其中每個元素的環境變量的設置格式為?name=value,如果子進程應該繼承當前進程的環境,或該參數為?null
dir?- 子進程的工作目錄;如果子進程應該繼承當前進程的工作目錄,則該參數為?null
返回:
一個新的?Process?對象,用于管理子進程
拋出:
SecurityException?- 如果安全管理器存在,并且其?checkExec?方法不允許創建子進程
IOException?- 如果發生 I/O 錯誤
NullPointerException?- 如果?cmdarray?為?null,或者?cmdarray?的某個元素為?null,抑或?envp?的某個元素為?null
IndexOutOfBoundsException?- 如果?cmdarray?是一個空數組(長度為?0
從以下版本開始:
1.3
另請參見:
ProcessBuilder

availableProcessors

public int availableProcessors()
向 Java 虛擬機返回可用處理器的數目。

該值在特定的虛擬機調用期間可能發生更改。因此,對可用處理器數目很敏感的應用程序應該不定期地輪詢該屬性,并相應地調整其資源用法。

?

返回:
虛擬機可用的最大處理器數目;從不小于 1
從以下版本開始:
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()
運行掛起 finalization 的所有對象的終止方法。調用此方法意味著 Java 虛擬機做了一些努力運行已被丟棄對象的?finalize?方法,但是這些對象的finalize?方法還沒有運行。當控制從方法調用中返回時,Java 虛擬機已經盡最大努力去完成所有未執行的終止方法。

如果不顯式調用?runFinalization?方法,則 Java 虛擬機會根據需要在單獨的線程中自動執行此終止過程。

方法?System.runFinalization()?是調用此方法的一種傳統而便捷的方式。

?

另請參見:
Object.finalize()

traceInstructions

public void traceInstructions(boolean?on)
啟用/禁用指令跟蹤。如果?boolean?變量為?true,則執行此方法意味著讓 Java 虛擬機發送虛擬機中每條指令執行的調試信息。該信息的格式,以及虛擬機所發送的文件或其他輸出流的格式取決于主機的環境。如果虛擬機不支持此功能,則忽略這一 請求。跟蹤輸出的目的地取決于系統。

如果?boolean?變量為?false,則執行此方法時將使 Java 虛擬機停止執行詳細的指令跟蹤。

?

參數:
on?- 為?true?時啟用指令跟蹤;為?false?時則禁用此功能。

traceMethodCalls

public void traceMethodCalls(boolean?on)
啟用/禁用方法調用跟蹤。如果?boolean?變量為?true,則執行此方法意味著讓 Java 虛擬機發送虛擬機中每個方法的調試信息。該信息的格式,以及虛擬機所發送的文件或其他輸出流的格式取決于主機的環境。如果虛擬機不支持此功能,則忽略這一請求。

使用變量 false 調用此方法意味著虛擬機停止發送每個調用的調試信息。

?

參數:
on?- 為?true?時啟用指令跟蹤;為?false?時則禁用此功能。

load

public void load(String?filename)
加載作為動態庫的指定文件名。文件名變量必須是一個完整的路徑名。對于?java_g,會自動在 "_g" 前面插入 ".so"(例如Runtime.getRuntime().load("/home/avh/lib/libX11.so");)。

首先,如果有安全管理器,則用?filename?作為參數調用?checkLink?方法。這可能導致安全異常。

這與?loadLibrary(String)?方法類似,但它接受通用文件名作為變量,而不僅僅是庫名,從而能夠加載所有的本機代碼文件。

方法?System.load(String)?是調用此方法的一種傳統而便捷的方式。

?

參數:
filename?- 要加載的文件。
拋出:
SecurityException?- 如果安全管理器存在,并且其?checkLink?方法不允許加載指定的動態庫
UnsatisfiedLinkError?- 如果文件不存在。
NullPointerException?- 如果?filename?為?null
另請參見:
getRuntime(),?SecurityException,?SecurityManager.checkLink(java.lang.String)

loadLibrary

public void loadLibrary(String?libname)
加載具有指定庫名的動態庫。從以前獲取庫文件的本地文件系統中加載含有本機代碼的文件。這一過程的細節取決于實現方法。可以以某種特定于系統的方式完成從庫名到特定文件名的映射。

首先,如果有安全管理器,則用?libname?作為參數調用?checkLink?方法。這可能導致安全性異常。

方法?System.loadLibrary(String)?是調用此方法的一種傳統而便捷的方式。如果在某個類實現中使用本機方法,則標準的策略是將本機代碼放入一個庫文件中(稱為?LibFile),然后在類聲明中放入一個靜態的初始值設定項:

static { System.loadLibrary("LibFile"); }
當加載并初始化這個類時,也將加載實現本機方法所需的本機代碼。

如果用相同庫名多次調用此方法,則忽略第二次及后續的調用。

?

參數:
libname?- 庫名。
拋出:
SecurityException?- 如果安全管理器存在,并且其?checkLink?方法不允許加載指定的動態庫
UnsatisfiedLinkError?- 如果庫不存在。
NullPointerException?- 如果?libname?為?null
另請參見:
SecurityException,?SecurityManager.checkLink(java.lang.String)

getLocalizedInputStream

@Deprecated
public InputStream getLocalizedInputStream(InputStream?in)
已過時。?從 JDK?1.1 開始,將本地編碼字節流轉換為 Unicode 字符流的首選方法是使用?InputStreamReader?和?BufferedReader?類。

?

創建輸入流的本地化版本。此方法獲取?InputStream,并返回除本地化外其他所有方面都和變量等效的?InputStream,這些方面包括:作為本地字符集中的字符從流中被讀取,并將它們從本地字符集自動轉換為 Unicode。

如果參數已經是本地化流,則可作為結果返回。

?

參數:
in?- 要本地化的 InputStream
返回:
已本地化的輸入流
另請參見:
InputStream,?BufferedReader.BufferedReader(java.io.Reader),?InputStreamReader.InputStreamReader(java.io.InputStream)

getLocalizedOutputStream

@Deprecated
public OutputStream getLocalizedOutputStream(OutputStream?out)
已過時。?從 JDK?1.1 開始,將 Unicode 字符流轉換為本地編碼字節流的首選方法是使用?OutputStreamWriterBufferedWriter?和?PrintWriter類。

?

創建輸出流的本地化版本。此方法獲取?OutputStream,并返回除本地化外其他所有方面都和變量等效的?OutputStream,這些方面包括:作為 Unicode 字符被寫入流中,并被自動轉換為本地字符集。

如果參數已經是本地流,則可作為結果返回。

?

參數:
out?- 要本地化的 OutputStream
返回:
已本地化的輸出流
另請參見:
OutputStream,?BufferedWriter.BufferedWriter(java.io.Writer),?OutputStreamWriter.OutputStreamWriter(java.io.OutputStream),PrintWriter.PrintWriter(java.io.OutputStream)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/542552.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/542552.shtml
英文地址,請注明出處:http://en.pswp.cn/news/542552.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java隊列實現限流,java中應對高并發的兩種策略

目的&#xff1a;提高可用性通過ExecutorService實現隊列泄洪//含有20個線程的線程池private ExecutorService executorService Executors.newFixedThreadPool(20);將有并發壓力的下游代碼放入到線程池的submit方法中&#xff0c;如下&#xff1a;//同步調用線程池的submit方法…

crontab 日志_liunx 中定時清理過期日志文件

問題描述經常遇到日志文件過多&#xff0c;占用大量磁盤空間&#xff0c;需要定期刪除過期日志。問題涉及方面刪除過期日志的腳本。定時任務刪除任務腳本先查詢到過期的日志文件&#xff0c;然后刪除。語法find path -option [ -print ] [ -exec -ok command ] …

JavaScript | 數組的常用屬性和方法

JavaScript的通用屬性和數組方法 (Common properties and methods of array in JavaScript ) Properties/MethodsDescriptionsarray.lengthReturns the length of the array/total number of elements of the array array[index]Returns the item name stored at “index” pos…

php dbutils 使用,dbutilsapi

相對lisp?而?言,可以使?用.net的強?大api,實現各種酷炫功能。相對c#及arx?...文件utils.py的模塊名分別是mycompany.utils和 mycompany.web.utils。 mycompany......CouchDB -b 關閉后臺運行的 CouchDB : CouchDB -d web 訪問:http://127.0.0.1:5984/_utils/index.html E-…

html 導航欄

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>lvnian學習(http://lvnian.blog.51cto.com/)</title> <style> ul {list-style-type:none;margin:0;padding:0; }a:link,a:visited{display:block;font-weigh…

將搜索二叉樹轉換為鏈表_將給定的二叉樹轉換為雙鏈表(DLL)

將搜索二叉樹轉換為鏈表Given a Binary tree and we have to convert it to a Doubly Linked List (DLL). 給定二叉樹&#xff0c;我們必須將其轉換為雙鏈表(DLL)。 Algorithm: 算法&#xff1a; To solve the problem we can follow this algorithm: 為了解決這個問題&#…

cuda編程_CUDA刷新器:CUDA編程模型

CUDA刷新器&#xff1a;CUDA編程模型 CUDA Refresher: The CUDA Programming Model CUDA&#xff0c;CUDA刷新器&#xff0c;并行編程 這是CUDA更新系列的第四篇文章&#xff0c;它的目標是刷新CUDA中的關鍵概念、工具和初級或中級開發人員的優化。 CUDA編程模型提供了GPU體系結…

php curl_error源碼,PHP curl_error函數

PHP curl_error函數(PHP 4 > 4.0.3, PHP 5)curl_error — 返回一個保護當前會話最近一次錯誤的字符串說明string curl_error ( resource $ch )返回一條最近一次cURL操作明確的文本的錯誤信息。參數ch由 curl_init() 返回的 cURL 句柄。返回值返回錯誤信息或 (空字符串) 如果…

SQL中Where與Having的區別

“Where” 是一個約束聲明&#xff0c;使用Where來約束來之數據庫的數據&#xff0c;Where是在結果返回之前起作用的&#xff0c;且Where中不能使用聚合函數。“Having”是一個過濾聲明&#xff0c;是在查詢返回結果集以后對查詢結果進行的過濾操作&#xff0c;在Having中可以使…

java 邏輯表達式 布爾_使用基本邏輯門實現布爾表達式

java 邏輯表達式 布爾將布爾表達式轉換為邏輯電路 (Converting Boolean Expression to Logic Circuit) The simplest way to convert a Boolean expression into a logical circuit is to follow the reverse approach in which we start from the output of the Boolean expre…

python自然語言處理書籍_精通Python自然語言處理pdf

自然語言處理&#xff08;NLP&#xff09;是有關計算語言學與人工智能的研究領域之一。NLP主要關注人機交互&#xff0c;它提供了計算機和人類之間的無縫交互&#xff0c;使得計算機在機器學習的幫助下理解人類語言。 本書詳細介紹如何使用Python執行各種自然語言處理&#xff…

通達oa 2013 php解密,通達OA漏洞學習 - 安全先師的個人空間 - OSCHINA - 中文開源技術交流社區...

說明通達OA漏洞在去年上半年已爆出&#xff0c;這不趁著周末沒事做&#xff0c;將源碼下載下來進行復現學習。文件包含測試文件包含檢測&#xff0c;payload1:ip/ispirit/interface/gateway.php?json{"url":"/general/../../mysql5/my.ini"}利用文件包含訪…

溫趙輪 訪談

“溫趙輪”三大軟狗&#xff0c;你聽說過嗎&#xff1f;今天的1024訪談錄給大家介紹的就是程序員中當之無愧的偶像組合——溫趙輪。 Winter寒冬。阿里P8&#xff0c;正在向P9的道路上奔跑。傳說中的他有錢、出身好&#xff0c;可不是搞互聯網的屌絲程序員。 老趙&#xff0c;…

linux開源文檔管理系統_Linux中的系統管理員問題 免費和開源軟件

linux開源文檔管理系統根帳號 (Root Account) The "root" account is the most unrestrictive account on a Linux Operating system. This account enables you to complete all features of System admin, including accounts, changing client passwords, looking…

matlab上機實驗1,上機實驗1:熟悉matlab基本操作

其中 x 在 [-2, 2] 間共等切分為 21 點&#xff0c;y 在 [-1, 1] 間共等切分為 21 點&#xff0c;所以此曲面共有 21*21441 個點。a. 請用預設的顏色對應表(Colormap)來畫出此曲面。 b. 請以曲面的斜率來設定曲面的顏色。 c. 請以曲面的曲率來設定曲面的顏色。2. 請用 meshc 指…

公眾號 -「前端攻略 開光篇」

作為一枚程序員&#xff0c;每件重要項目的開始都忍不住使用"Hello World"。 這個公眾號是不是來晚了&#xff1f;如果你有這個疑問&#xff0c;那么我想說&#xff1a;對于寫作和思考&#xff0c;任何時候都不晚。我用四個簡單的自問自答&#xff0c;來講講這個前端…

python 桌面應用 啟動緩慢_如何加快Python 應用的啟動時間

我聽說pipenv9.0.2已經發布&#xff0c;啟動時間有了很大的改進。 我很快就試了一下&#xff0c;但我覺得并不快。所以我用Python3.7的新特性來研究它。 在本文中&#xff0c;我將介紹該特性以及如何使用它。 啟動時間≒導入時間 例如&#xff0c;pipenv -h 的執行時間比顯示幫…

python單詞首字母大寫_在Python中將每個單詞的首字母大寫

python單詞首字母大寫Here, we are implementing a python program to capitalizes the first letter of each word in a string. 在這里&#xff0c;我們正在實現一個python程序來大寫字符串中每個單詞的首字母。 Example: 例&#xff1a; Input: "HELLO WORLD!"O…

matlab中求模最大,matlab求取模極大值時出錯

本帖最后由 Nate_ 于 2016-4-17 15:57 編輯points1024 時&#xff0c;有波形輸出&#xff0c;但信號有5438個點。改為5438就不行。主程序&#xff1a;%小波模極大值重構是采用的交替投影法close all;points5438; level4; sr360; num_inter6; wfdb4;%所處理數據的…

stl向量_如何檢查C ++ STL中向量中是否存在元素?

stl向量Given a vector and an element to be searched in the vector. 給定一個向量和要在向量中搜索的元素。 To check whether an elements exists in a vector or not – we use find() function. find() function takes 3 arguments. 要檢查向量中是否存在元素 –我們使用…