Runtime簡(jiǎn)介
當(dāng)程序運(yùn)行時(shí)聪廉,每個(gè)java應(yīng)用程序都能得到一個(gè)運(yùn)行時(shí)的實(shí)例树绩,應(yīng)用程序不能創(chuàng)建這個(gè)實(shí)例,只能從getRuntime()方法獲得RunTime實(shí)例筝蚕。
1. RunTime是單例模式卦碾,不能實(shí)例化
private static Runtime currentRuntime = new Runtime();
public static Runtime getRuntime() {
return currentRuntime;
}
private Runtime() {}
我們看到源碼是單例模式實(shí)例(餓漢式,線(xiàn)程安全 但效率比較低 ),設(shè)計(jì)成單例主要是從節(jié)約系統(tǒng)資源來(lái)考慮起宽。
2. Runtime幾個(gè)核心方法
-
exec("notepad");
在單獨(dú)的進(jìn)程中執(zhí)行指定的字符串命令洲胖。
- exec("notepad","demo");
在單獨(dú)的進(jìn)程中執(zhí)行指定命令和變量。
availableProcessors();
向 Java 虛擬機(jī)返回可用處理器的數(shù)目坯沪。
int num = Runtime.getRuntime().availableProcessors();
System.out.println("返回本機(jī)處理器結(jié)果:" + num);
返回本機(jī)處理器結(jié)果:4
Runtime.getRuntime().freeMemory();
返回 Java 虛擬機(jī)中的空閑內(nèi)存量绿映。
Long memory = Runtime.getRuntime().freeMemory();
System.out.println(memory);
- gc();
運(yùn)行垃圾回收器。
try {
Long memoryBefor = Runtime.getRuntime().freeMemory();
System.out.println("當(dāng)前內(nèi)存: "+memoryBefor);
Runtime.getRuntime().gc();
Long memoryAfter = Runtime.getRuntime().freeMemory();
System.out.println("執(zhí)行完GC后內(nèi)存:"+memoryAfter);
} catch (Exception e) {
e.printStackTrace();
}
當(dāng)前內(nèi)存: 15722728
執(zhí)行完GC后內(nèi)存:16027912
load(String filename)
加載作為動(dòng)態(tài)庫(kù)的指定文件名腐晾。maxMemory() ;
返回 Java 虛擬機(jī)試圖使用的最大內(nèi)存量叉弦。
Long maxMemeory = Runtime.getRuntime().maxMemory();
System.out.println(maxMemeory);
259522560totalMemory()
返回 Java 虛擬機(jī)中的內(nèi)存總量。
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)
啟用/禁用跟蹤的指令藻糖。如果布爾參數(shù)是正確的,該方法表明,Java虛擬機(jī)發(fā)出調(diào)試信息每條指令的執(zhí)行虛擬機(jī)淹冰。這些信息的格式,文件或其他輸出流釋放它,取決于主機(jī)環(huán)境。虛擬機(jī)可能會(huì)忽略這個(gè)請(qǐng)求,如果它不支持此功能巨柒。跟蹤輸出的目的地是依賴(lài)于系統(tǒng)的樱拴。
如果布爾參數(shù)是假的,這個(gè)方法會(huì)導(dǎo)致虛擬機(jī)停止執(zhí)行的詳細(xì)指令跟蹤執(zhí)行柠衍。
我在本機(jī)(hotspot JDK1.8)不管如何測(cè)試,都沒(méi)打印出任何信息晶乔,不知是否是虛擬機(jī)不支持還是什么情況珍坊。 - traceMethodCalls(on)
啟用/禁用方法調(diào)用跟蹤,同上正罢。
3. RunTime應(yīng)用
-
內(nèi)存監(jiān)控
我們可以結(jié)合RunTime方法幾個(gè)特點(diǎn)阵漏,做個(gè)實(shí)時(shí)內(nèi)存監(jiān)控,如我監(jiān)控某個(gè)方法執(zhí)行消耗了多少內(nèi)存
public static void main(String[] args) {
Long freeMemery1,freeMemery2;
try {
Runtime r = Runtime.getRuntime();
freeMemery1 = r.freeMemory();
aa();
freeMemery2 = r.freeMemory();
System.out.println("調(diào)用方法aa()使用了" + (freeMemery1 - freeMemery2));
} catch (Exception e) {
e.printStackTrace();
}
}
public static void aa(){
byte aa [] = new byte[1024 * 1024];
}
輸出結(jié)果:
調(diào)用方法aa()使用了1048592
-
JVM實(shí)時(shí)系統(tǒng)內(nèi)存監(jiān)控
讀者可根據(jù)上面的方法自行實(shí)現(xiàn)翻具,實(shí)現(xiàn)依據(jù)是RunTime是單例的履怯,在單機(jī)JVM上拿總內(nèi)存減去空閑內(nèi)存即可
-
系統(tǒng)小工具
可以windows平臺(tái)上直接調(diào)用,如查看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();
}
}
總結(jié)
本文是舉例說(shuō)明了我們常見(jiàn)的幾個(gè)方法呛占,其中內(nèi)存監(jiān)控和exec最為常見(jiàn)虑乖。上面示例都實(shí)現(xiàn)并測(cè)試通過(guò),如有不正確晾虑,請(qǐng)批評(píng)指正疹味,謝謝。