留個記錄,順便說一下轉載背景:在做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中轉載的查看和增加虛擬機內存的方式。
[轉載1]http://www.iteye.com/problems/54114
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真正還可以再繼續使用的內存(不考慮之後垃圾回收再次得到的內存)。由【最大內存 - 已分配內存 + 已分配內存中的剩餘空間】計算得到。
[轉載2]http://fys249931556.blog.163.com/blog/static/1227223462009622105352765/
可以用代碼查看,也可以在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