提及到Java進程在啟動並執行時候記憶體使用量情況,是很多初學者比較迷惑的地方,也就是我們在運行編譯好的.class檔案時jvm向作業系統申請的記憶體如何查看。
可以使用jdk內建的運行時系統參數描述類RunTime中的三個方法來查看
RunTime.getRunTime().maxMemory();查看JVM虛擬機器可以向當前所在宿主的作業系統"可以"申請到的最大記憶體;如果程式運行時設定了-Xmx參數那麼這個值等於使用者佈建值,如果沒有設定預設為64m;
RunTime.getRunTime().totalMemory();查看JVM虛擬機器當前"已經"申請到的記憶體大小;如果程式運行時設定了-Xms參數那麼這個值等於使用者佈建值,如果沒有設定那麼程式會根據當前系統啟動並執行情況自動申請,但這個值必定小於等於RunTime.getTime().maxMemory;
RunTime.getRunTime().freeMemory();查看JVM中目前已經申請的到的記憶體中未使用的記憶體部分;這個值根據當前JVM申請到的記憶體使用量的越來越多的話,那麼這個值就會越小;
/*
*-Xmx10m :java進程最大可以向作業系統申請的記憶體數
*-Xms1m :java進程初始化時預設申請的記憶體(隨著系統的運行這個值會越來越大直到等於-Xmx值)
*/
public class HeapConfig {
public static void main(String[] args) {
System.out.println("Java進程可以向作業系統申請到的最大記憶體:"+(Runtime.getRuntime().maxMemory())/(1024*1024)+"M");
System.out.println("Java進程空閑記憶體:"+(Runtime.getRuntime().freeMemory())/(1024*1024)+"M");
System.out.println("Java進程現在從作業系統那裡已經申請了記憶體:"+(Runtime.getRuntime().totalMemory())/(1024*1024)+"M");
byte[] bys = new byte[1024*1024];//申請1M記憶體
System.out.println("Java進程可以向作業系統申請到的最大記憶體:"+(Runtime.getRuntime().maxMemory())/(1024*1024)+"M");
System.out.println("Java進程空閑記憶體:"+(Runtime.getRuntime().freeMemory())/(1024*1024)+"M");
System.out.println("Java進程現在從作業系統那裡已經申請了記憶體:"+(Runtime.getRuntime().totalMemory())/(1024*1024)+"M");
}
}
控制台輸出結果
Java進程可以向作業系統申請到的最大記憶體:9M
Java進程空閑記憶體:5M
Java進程現在從作業系統那裡已經申請了記憶體:5M
Java進程可以向作業系統申請到的最大記憶體:9M
Java進程空閑記憶體:4M
Java進程現在從作業系統那裡已經申請了記憶體:5M