Java RunTime類

RunTime

 

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

leizhimin 51cto技術博客
 

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

leizhimin 51cto技術博客
 

leizhimin 51cto技術博客
二、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)
      啓用/禁用方法調用跟蹤。

leizhimin 51cto技術博客
 

leizhimin 51cto技術博客
三、常見的應用


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

leizhimin 51cto技術博客
//此實例來自《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);

leizhimin 51cto技術博客
        mem2 = r.freeMemory();
        System.out.println("Free memory after allocation : " + mem2);
        System.out.println("Memory used by allocation : " +(mem1-mem2));

leizhimin 51cto技術博客
        //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);
    }
}

leizhimin 51cto技術博客
編譯後運行結果如下(不同的機器不同時間運行的結果也不一定一樣):
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

leizhimin 51cto技術博客
 

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

leizhimin 51cto技術博客
//此實例來自《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.");
        }
    }
}

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

leizhimin 51cto技術博客
//此實例來自《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
請按任意鍵繼續. . .

leizhimin 51cto技術博客
 

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章