概述
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編程纔會用到。小弟不才,這裏只能先給一個大寫的略字了