java基礎(chǔ):java.lang.Runtime

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í)例(餓漢式,線程安全 但效率比較低 ),設(shè)計(jì)成單例主要是從節(jié)約系統(tǒng)資源來考慮。

2. Runtime幾個(gè)核心方法

  • exec("notepad");
    在單獨(dú)的進(jìn)程中執(zhí)行指定的字符串命令。


    Paste_Image.png
  • exec("notepad","demo");
    在單獨(dú)的進(jìn)程中執(zhí)行指定命令和變量。
Paste_Image.png
  • 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)庫的指定文件名。

  • maxMemory() ;
    返回 Java 虛擬機(jī)試圖使用的最大內(nèi)存量。
    Long maxMemeory = Runtime.getRuntime().maxMemory();
    System.out.println(maxMemeory);
    259522560

  • totalMemory()
    返回 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)求,如果它不支持此功能。跟蹤輸出的目的地是依賴于系統(tǒng)的。
    如果布爾參數(shù)是假的,這個(gè)方法會(huì)導(dǎo)致虛擬機(jī)停止執(zhí)行的詳細(xì)指令跟蹤執(zhí)行。
    我在本機(jī)(hotspot JDK1.8)不管如何測(cè)試,都沒打印出任何信息,不知是否是虛擬機(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();
}
}

Paste_Image.png

總結(jié)

本文是舉例說明了我們常見的幾個(gè)方法,其中內(nèi)存監(jiān)控和exec最為常見。上面示例都實(shí)現(xiàn)并測(cè)試通過,如有不正確,請(qǐng)批評(píng)指正,謝謝。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Java經(jīng)典問題算法大全 /*【程序1】 題目:古典問題:有一對(duì)兔子,從出生后第3個(gè)月起每個(gè)月都生一對(duì)兔子,小兔子...
    趙宇_阿特奇閱讀 2,075評(píng)論 0 2
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,642評(píng)論 18 399
  • 第一章 初識(shí)javaJAVA 第一講:什么是程序?:為了讓計(jì)算機(jī)執(zhí)行某些操作或解決某個(gè)問題而編寫的一系列有序指令的...
    人子日月幾點(diǎn)閱讀 592評(píng)論 0 1
  • 小編費(fèi)力收集:給你想要的面試集合 1.C++或Java中的異常處理機(jī)制的簡(jiǎn)單原理和應(yīng)用。 當(dāng)JAVA程序違反了JA...
    八爺君閱讀 5,182評(píng)論 1 114
  • 夏月偷偷走了 我還是喜慶著小日子與詩 十月延續(xù)我的滿滿心思 好在我的前奏已有準(zhǔn)備 準(zhǔn)備了好心情去看你的世界 我所剩...
    鮑川克閱讀 359評(píng)論 0 0

友情鏈接更多精彩內(nèi)容