Runtime 類
關於 Java 中的 Runtime 類對象,每一個 Java 應用都隻有一個 Runtime 對象單實例,而 Runtime 類是不能通過 new 方法創建的。因為在這個類中,它將其構造方法私有化了,並提供了一個**惡漢式的單例設計模式**來獲得 Runtime 對象。下麵是這個類上述中的關鍵代碼:
public class Runtime {
private static Runtime currentRuntime = new Runtime();
public static Runtime getRuntime() {
return currentRuntime;
}
private void Runtime() {};
}
Runtime 有三個查看 Java 應用與內存相關的方法,freeMemory, totalMemory, maxMemory,現在通過代碼展示了解一下:
public class Test {
public static void main(String[] args) {
Runtime runtime = Runtime.getRuntime();
// 返回 java 虛擬機將會嚐試去獲取的最大內存容量
System.out.println("係統最大可用空間: " + convertBytesToM(runtime.maxMemory()));
// 返回 java 虛擬機的總共內存量。這個值將會隨著時間變化,具體取決於主機環境。
System.out.println("係統總共內存量: " + convertBytesToM(runtime.totalMemory()));
// 返回java虛擬機可用的內存容量。可以調用 gc 方法來增加 freeMemory
System.out.println("係統可用內存量:" + convertBytesToM(runtime.freeMemory()));
}
private static long convertBytesToM(long bytes) {
return bytes/1024/1024;
}
}
在我的本機上,結果顯示如下:
嚐試創建對象來提高 java 虛擬機占用的總內存和減少可用內存,並使用“垃圾回收”方法,來提高 freeMemory
代碼如下:
public class Test {
public static void main(String[] args) {
Runtime runtime = Runtime.getRuntime();
// 返回 java 虛擬機將會嚐試去獲取的最大內存容量
System.out.println("1.係統最大可用空間: " + convertBytesToM(runtime.maxMemory()) + " MB");
// 返回 java 虛擬機的總共內存量。這個值將會隨著時間變化,具體取決於主機環境。
System.out.println("1.係統總共內存量: " + convertBytesToM(runtime.totalMemory()) + " MB");
// 返回java虛擬機可用的內存容量。可以調用 gc 方法來增加 freeMemory
System.out.println("1.係統可用內存量:" + convertBytesToM(runtime.freeMemory()) + " MB");
System.out.println("-----------------------------------------------------------");
String garbageStr = "";
for (int i = 0; i < 20000; i++) {
garbageStr += i;
}
System.out.println("2.係統最大可用空間: " + convertBytesToM(runtime.maxMemory()) + " MB");
System.out.println("2.係統總共內存量: " + convertBytesToM(runtime.totalMemory()) + " MB");
System.out.println("2.係統可用內存量:" + convertBytesToM(runtime.freeMemory()) + " MB");
System.out.println("-----------------------------------------------------------");
runtime.gc();
System.out.println("3.係統最大可用空間: " + convertBytesToM(runtime.maxMemory()) + " MB");
System.out.println("3.係統總共內存量: " + convertBytesToM(runtime.totalMemory()) + " MB");
System.out.println("3.係統可用內存量:" + convertBytesToM(runtime.freeMemory()) + " MB");
}
private static long convertBytesToM(long bytes) {
return bytes/1024/1024;
}
}
當創建循環創建字符串對象之後, Java 應用總內存根據主機情況從 307 MB ---> 1783 MB,而對象占用了有 1783 - 1687 = 96 MB 的內存。其中有很多是廢棄的對象,但同時占用了內容。Java 虛擬機的垃圾回收機製會在需要的時候回收這些垃圾對象,它的處理是另開一個獨立的線程即使程序並沒有顯式地去調用。 不過有時,我們可能出於當前情況性能的考慮,需要立即進行垃圾對象回收,這時就可以調用 gc() 方法。如上圖所示,調用此方法後,係統回收了相當一部分內存,1687 ---> 1751.
最後更新:2017-08-20 15:32:15