Runtime簡介
當程序運行時,每個java應用程序都能得到一個運行時的實例,應用程序不能創建這個實例,只能從getRuntime()方法獲得RunTime實例。
1. RunTime是單例模式,不能實例化
private static Runtime currentRuntime = new Runtime();
public static Runtime getRuntime() {
return currentRuntime;
}
private Runtime() {}
我們看到源碼是單例模式實例(餓漢式,線程安全 但效率比較低 ),設計成單例主要是從節約系統資源來考慮。
2. Runtime幾個核心方法
-
exec("notepad");
在單獨的進程中執行指定的字符串命令。
Paste_Image.png - exec("notepad","demo");
在單獨的進程中執行指定命令和變量。
availableProcessors();
向 Java 虛擬機返回可用處理器的數目。
int num = Runtime.getRuntime().availableProcessors();
System.out.println("返回本機處理器結果:" + num);
返回本機處理器結果:4
Runtime.getRuntime().freeMemory();
返回 Java 虛擬機中的空閑內存量。
Long memory = Runtime.getRuntime().freeMemory();
System.out.println(memory);
- gc();
運行垃圾回收器。
try {
Long memoryBefor = Runtime.getRuntime().freeMemory();
System.out.println("當前內存: "+memoryBefor);
Runtime.getRuntime().gc();
Long memoryAfter = Runtime.getRuntime().freeMemory();
System.out.println("執行完GC后內存:"+memoryAfter);
} catch (Exception e) {
e.printStackTrace();
}
當前內存: 15722728
執行完GC后內存:16027912
load(String filename)
加載作為動態庫的指定文件名。maxMemory() ;
返回 Java 虛擬機試圖使用的最大內存量。
Long maxMemeory = Runtime.getRuntime().maxMemory();
System.out.println(maxMemeory);
259522560totalMemory()
返回 Java 虛擬機中的內存總量。
try {
Long freeMemory = Runtime.getRuntime().freeMemory();
System.out.println(freeMemory);
Long totalMemory = Runtime.getRuntime().totalMemory();
System.out.println(totalMemory);
System.out.println("已使用:" + (totalMemory - freeMemory));
} catch (Exception e) {
e.printStackTrace();
}
15722728
16252928
已使用:530200
- traceInstructions(on)
啟用/禁用跟蹤的指令。如果布爾參數是正確的,該方法表明,Java虛擬機發出調試信息每條指令的執行虛擬機。這些信息的格式,文件或其他輸出流釋放它,取決于主機環境。虛擬機可能會忽略這個請求,如果它不支持此功能。跟蹤輸出的目的地是依賴于系統的。
如果布爾參數是假的,這個方法會導致虛擬機停止執行的詳細指令跟蹤執行。
我在本機(hotspot JDK1.8)不管如何測試,都沒打印出任何信息,不知是否是虛擬機不支持還是什么情況。 - traceMethodCalls(on)
啟用/禁用方法調用跟蹤,同上。
3. RunTime應用
-
內存監控
我們可以結合RunTime方法幾個特點,做個實時內存監控,如我監控某個方法執行消耗了多少內存
public static void main(String[] args) {
Long freeMemery1,freeMemery2;
try {
Runtime r = Runtime.getRuntime();
freeMemery1 = r.freeMemory();
aa();
freeMemery2 = r.freeMemory();
System.out.println("調用方法aa()使用了" + (freeMemery1 - freeMemery2));
} catch (Exception e) {
e.printStackTrace();
}
}
public static void aa(){
byte aa [] = new byte[1024 * 1024];
}
輸出結果:
調用方法aa()使用了1048592
-
JVM實時系統內存監控
讀者可根據上面的方法自行實現,實現依據是RunTime是單例的,在單機JVM上拿總內存減去空閑內存即可
-
系統小工具
可以windows平臺上直接調用,如查看java -version
public static void main(String[] args) {
try {
Runtime r = Runtime.getRuntime();
Process process = r.exec("java");
InputStream in = process.getInputStream();
Scanner scanner;
scanner = new Scanner(in);
while (scanner.hasNext()) {
System.out.println(scanner.nextLine());
}
} catch (Exception e) {
e.printStackTrace();
}
}
總結
本文是舉例說明了我們常見的幾個方法,其中內存監控和exec最為常見。上面示例都實現并測試通過,如有不正確,請批評指正,謝謝。