問題:
在eclipse中執行java程序。去重100多萬的數據,報例如以下錯誤:
java.lang.OutOfMemoryError: Java heap space
在JVM中假設98%的時間是用於GC且可用的 Heap size 不足2%的時候將拋出此異常信息。
JVM堆的設置是指java程序執行過程中JVM能夠調配使用的內存空間的設置。
JVM在啟動的時候會自己主動設置Heap size的值,其初始空間(即-Xms)是物理內存的1/64,最大空間(-Xmx)是物理內存的1/4。能夠利用JVM提供的-Xmn -Xms -Xmx等選項可進行設置。
比方:java -Xmx3550m -Xms3550m -Xmn2g -Xss128k
-Xmx3550m:設置JVM最大可用內存為3550m。
-Xms3550m:設置JVM初始內存為3550m。
此值能夠設置與-Xmx同樣,以避免每次垃圾回收完畢后JVM又一次分配內存。
-Xmn2g:設置年輕代大小為2G。
整個JVM內存大小=年輕代大小 + 年老代大小 + 持久代大小。持久代一般固定大小為64m.整個堆大小=年輕代大小 + 年老代大小.所以增大年輕代后。將會減小年老代大小。此值對系統性能影響較大,Sun官方推薦配置為整個堆的3/8。
-Xss128k:設置每一個線程的堆棧大小。JDK5.0以后每一個線程堆棧大小為1M,曾經每一個線程堆棧大小為256K。
更具應用的線程所需內存大小進行調整。在同樣物理內存下。減小這個值能生成很多其它的線程。可是操作系統對一個進程內的線程數還是有限制的,不能無限生成,經驗值在3000~5000左右。
方案一:
eclipse 啟動參數里能夠設置jvm大小,由於eclipse執行時也須要jvm。eclipse.ini里設置的jvm大小不是詳細某個程序執行時所用jvm的大小,對所有程序有效。
那么怎么才干設置某個程序的jvm大小呢?
(當然控制台執行的話不會存在這個問題,如:java -Xms256m -Xmx1024m classname,這樣就能夠把當前程序的jvm大小給設定)
eclipse默認的jvm配置為:-Xms8m -Xmx128m,在內存不足時須要手動調整一下。
詳細的設置方法為:
選中被執行的類。點擊菜單‘run->run configurations’,選擇(x)=Argument標簽頁下的vm arguments框里輸入
-Xms64m-Xmx512m(依據你物理內存的大小調整),保存執行就ok了
這個問題的根源是jvm虛擬機默認Heap大小是64M。能夠通過設置其最大和最小值來實現。
設置的方法主要有下面:
1.能夠在windows 更改系統環境變量加上JAVA_OPTS=-Xms64m -Xmx512m。
2.假設用的tomcat,
1)在windows下,能夠在C:\tomcat5.5.9\bin\catalina.bat 中加上:set JAVA_OPTS=-Xms64m -Xmx256m。
位置在: rem Guess CATALINA_HOME if not defined 這行的以下加合適。2)在linux下,在{tomcat_home}/bin/catalina.sh的前面,加 set JAVA_OPTS='-Xms64 -Xmx512'。
