1. 程式人生 > >[轉載]檢視虛擬機器記憶體

[轉載]檢視虛擬機器記憶體

留個記錄,順便說一下轉載背景:在做excel匯入時,10萬條輸入寫入2個sheet時,報虛擬機器異常

java.lang.OutOfMemoryError: Java heap space
Exception in thread "main" java.lang.RuntimeException: java.lang.OutOfMemoryError: Java heap space
 at jxl.write.biff.File.write(File.java:148)
 at jxl.write.biff.RowRecord.writeCells(RowRecord.java:297)
 at jxl.write.biff.SheetWriter.write(SheetWriter.java:440)
 at jxl.write.biff.WritableSheetImpl.write(WritableSheetImpl.java:1257)
 at jxl.write.biff.WritableWorkbookImpl.write(WritableWorkbookImpl.java:839)

這個是匯入excel的資料的格式。(90600條測試通過)。

所以需要增大本地虛擬機器記憶體了,下面是2中轉載的檢視和增加虛擬機器記憶體的方式。

 java.lang.Runtime類提供了檢視當前JVM記憶體的使用情況。每個java例項(即虛擬機器例項)只有一個Runtime的例項,通過Runtime.getRuntime()可以得到當前虛擬機器中的Runtime例項物件。

Runtime提供3個方法可以獲取當前JVM最大可以使用記憶體、當前JVM已擁有最大記憶體和剩餘未使用記憶體。這3個記憶體指的都是JVM堆記憶體。

Runtime.maxMemory();

Runtime.totalMemory();

Runtime.freeMemory();



首先在JAVA的啟動引數中加入指定-Xmx100m,設定JVM堆最大可以使用100m的記憶體。

Runtime run = Runtime.getRuntime();

long max = run.maxMemory();

long total = run.totalMemory();

long free = run.freeMemory();

long usable = max - total + free;

System.out.println("最大記憶體 = " + max);
System.out.println("已分配記憶體 = " + total);
System.out.println("已分配記憶體中的剩餘空間 = " + free);
System.out.println("最大可用記憶體 = " + usable);



上面程式碼的輸出結果如下(這些記憶體大小與執行環境相關)

最大記憶體 = 104071168
已分配記憶體 = 5177344
已分配記憶體中的剩餘空間 = 4937280
最大可用記憶體 = 103831104



最大記憶體(maxMemory)是通過啟動JAVA虛擬機器時使用引數-Xmx100m指定的,而輸出也確實是100m。這表示JVM的堆記憶體最大可以使用104071168位元組。

已分配記憶體(totalMemory)jvm使用的記憶體都是從本地系統獲取的,但是通常jvm剛啟動的時候,並不會向系統申請全部的記憶體。而是根據所載入的Class和相關資源的容量來決定的。在本例中,由於只在一個main()主方法中執行了上面的幾行簡單的程式碼。所以JVM只申請了5177344位元組的記憶體。

已分配記憶體中的剩餘空間(freeMemory) 這是相對以分配記憶體(totalMemeory)計算的,相當於totalMemory - 已使用記憶體。當freeMemory 快要接近0時,以分配的記憶體即將耗盡,JVM會決定再次向系統申請更多的記憶體。

最大可用記憶體 (usable)這是JVM真正還可以再繼續使用的記憶體(不考慮之後垃圾回收再次得到的記憶體)。由【最大記憶體 - 已分配記憶體 + 已分配記憶體中的剩餘空間】計算得到。

可以用程式碼檢視,也可以在eclipse中增添相關資訊後直接檢視。

1. 用下面的程式碼進行JVM的記憶體檢視

memory.java


import java.lang.Runtime;

public class memory {
public static void main(String args[]) {
System.out.println("usage:");
memory m=new memory();
long t=m.showUsage();
System.out.println("Total:"+ t + " Bytes");
long fr=m.freeMemory();
//System.gc();
System.out.println("Free:"+fr + " Bytes");
long rem=t-fr;
System.out.println("Occupied Space :"+rem + " Bytes");
}


public long showUsage() {
long l=Runtime.getRuntime().totalMemory();
return(l);
}


public long freeMemory() {
long f=Runtime.getRuntime().freeMemory();
return(f);
}
}

2. 在Eclipse中檢視JVM記憶體

a.在eclipse根目錄下建立一個檔案,檔名options,不要加字尾直接儲存,檔案內容org.eclipse.ui/perf/showHeapStatus=true
b.修改eclipse目錄下的eclipse.ini檔案,在檔案起始部分新增如下內容:
-debug
options
-vm
javaw.exe
重新啟動eclipse,就可以看到下方狀態條多了JVM的資訊


3、改變JVM記憶體大小的方法
java -Xms100m -Xmx250 memory