聊聊Java中的Runtime類

概述

Runtime類封裝了運行時的環境。每個 Java 應用程序都有一個 Runtime 類實例,使應用程序能夠與其運行的環境相連接。

我們不能實例化一個Runtime對象,應用程序也不能創建自己的 Runtime 類實例,但可以通過 getRuntime 方法獲取當前Runtime運行時對象的引用。一旦得到了一個當前的Runtime對象的引用,就可以調用Runtime對象的方法去控制Java虛擬機的狀態和行爲

當Applet和其他不被信任的代碼調用任何Runtime方法時,常常會引起SecurityException異常。

API方法示例

我們先來看看幾個native方法:

public native int availableProcessors();
public native long freeMemory();
public native long totalMemory();
public native long maxMemory();

使用示例如下:

Runtime rt = Runtime.getRuntime();
System.out.println("處理器數量:" + rt.availableProcessors()); //處理器數量:4
System.out.println("空閒內存數:" + rt.freeMemory() / 1024 / 1024 + "mb"); //空閒內存數:111mb
System.out.println("總內存數:" + rt.totalMemory() / 1024 / 1024 + "mb"); //總內存數:120mb
System.out.println("可用最大內存數:" + rt.maxMemory() / 1024 / 1024 + "mb"); //可用最大內存數:1910mb

使用場景:
通過totalMemory()和freeMemory()方法可以知道對象的堆內存有多大,還剩多少。

Java會週期性的回收垃圾對象(未使用的對象),以便釋放內存空間。但是如果想先於收集器的下一次指定週期來收集廢棄的對象,可以通過調用gc()方法來根據需要運行無用單元收集器。一個很好的試驗方法是先調用gc()方法,然後調用freeMemory()方法來查看基本的內存使用情況,接着執行代碼,然後再次調用freeMemory()方法看看分配了多少內存。

  • version()方法 (since Java9)
    java9t提供了Version方法,可以放我們和方便的獲取到運行時的一些參數信息,可以說是非常的人性化。我們看看這個方法源碼:
public static Version version() {
        if (version == null) {
            version = new Version(VersionProps.versionNumbers(),
                    VersionProps.pre(), VersionProps.build(),
                    VersionProps.optional());
        }
        return version;
}

我們發現所有的參數都來自於VersionProps,所以我們貼一些它的源碼,大家就都清晰了

class VersionProps {
        private static final String launcher_name = "java";
        private static final String java_version = "10.0.2";
        private static final String java_version_date = "2018-07-17";
        private static final String java_runtime_name = "Java(TM) SE Runtime Environment";
        private static final String java_runtime_version = "10.0.2+13";
        private static final String VERSION_NUMBER = "10.0.2";
        private static final String VERSION_BUILD = "13";
        private static final String VERSION_PRE = "";
        private static final String VERSION_OPT = "";
        private static final boolean isLTS = "".startsWith("LTS");
        private static final String VENDOR_VERSION_STRING = "18.3";
        private static final String vendor_version = (VENDOR_VERSION_STRING.length() > 0
                        ? " " + VENDOR_VERSION_STRING : "");
        static {
            init();
        }
}

由於我的JDK版本是Java10,所以各位的參數可能和我的不太一樣。我運行一下如下:

System.out.println(Runtime.version()); //10.0.2+13

執行其它程序

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

 public static void main(String[] args) throws IOException {
        Runtime rt = Runtime.getRuntime();
        //rt.exec("notepad.exe"); //打開記事本 備註:.exe可以省略 下同
        Process process = rt.exec("calc.exe");//打開計算器
        System.out.println(process); //Process[pid=8108, exitValue="not exited"]
 }

在新程序開始運行後就可以使用Process的方法了。可以用destory()方法殺死子進程,也可以使用waitFor()方法等待程序直到子程序結束,exitValue()方法返回子進程結束時返回的值。如果沒有錯誤,將返回0,否則返回非0。

public static void main(String[] args) throws IOException, InterruptedException {
        Runtime rt = Runtime.getRuntime();
        Process process = rt.exec("notepad.exe"); //打開記事本 備註:.exe可以省略 下同
        //Process process = rt.exec("calc.exe");//打開計算器
        process.waitFor(); //阻塞  等到子進程執行結束
        System.out.println("字進行執行完事了~~~");
        process.destroyForcibly(); //強制殺死子進程 destroy
 }

運行結果:(當關閉記事本後,會接着運行程序,打印信息)

和Gc相關的方法

  • exit(int status)
    • 通過啓動虛擬機的關閉序列,終止當前正在運行的 Java 虛擬機。
  • gc()
    • 運行垃圾回收器。
  • halt(int status)
    • 強行終止目前正在運行的 Java 虛擬機。

load和loadLibrary

這兩個方法是我們在使用Java的JNI機制時,會用到的一個非常重要的函數,它的作用即是把實現了我們在Java code中聲明的native方法的那個libraryload進來,或者load其他什麼動態連接庫

這兒JNI編程纔會用到。小弟不才,這裏只能先給一個大寫的略字了

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