天天看點

java.lang.OutOfMemoryError: Java heap space錯誤和方法(集、轉)

錯誤的方式來解決溢出下面的堆空間是從網上找:

java.lang.OutOfMemoryError: Java heap space

===================================================

使用Java程式從資料庫中查詢大量的資料時出現異常:

在JVM中假設98%的時間是用于GC且可用的 Heap size 不足2%的時候将抛出此異常資訊。

JVM堆的設定是指java程式執行過程中JVM能夠調配使用的記憶體空間的設定.

JVM在啟動的時候會自己主動設定Heap size的值。其初始空間(即-Xms)是實體記憶體的1/64,最大空間(-Xmx)是實體記憶體的1/4。能夠利用JVM提供的-Xmn -Xms -Xmx等選項可進行設定。

比如:java -jar -Xmn16m -Xms64m -Xmx128m MyApp.jar

假設Heap Size設定偏小,除了這些異常資訊外,還會發現程式的響應速度變慢了。GC占用了很多其它的時間,而應用配置設定到的運作時間較少。

Heap Size 最大不要超過可用實體記憶體的80%,一般的要将-Xms和-Xmx選項設定為同樣,而-Xmn為1/4的-Xmx值。

Heap size的 -Xms -Xmn 設定不要超出實體記憶體的大小。否則會提示“Error occurred during initialization of VM Could not reserve enough space for object heap”。

==========================================================

經過一個晚上的努力最終完畢了一個檔案替換指定字元串的程式,可是因為我要替換的全站程式html檔案太多。是以eclipse下邊老是在一個檔案夾結束後報出java.lang.OutOfMemoryError: Java heap space的異常,然後就崩潰了。

我一想肯定是頻繁操作造成來不及回收。于是在每一個循環之後加上一個Thread.sleep(1000),發現還是到那個檔案夾下就死掉,于是把1000改成5000,還是到那裡死掉,我想可能不是來不及回收這麼簡單,也許sun 的JVM裡邊剛好對于這樣的情況不釋放也有可能。

接着我又把啟動的參數添上一個 -Xmx256M,這回就能夠了。

想一想。還是對于垃圾回收的原理不太了解,就在網上查了一下,發現了幾篇不錯的文章。

​​http://java.ccidnet.com/art/3539/20060314/476073_1.html​​

​​http://www.pconline.com.cn/pcedu/empolder/gj/java/0509/701281.html​​

還有:Java堆的管理—垃圾回收提到一下幾點,非常不錯,也許能夠作為敲代碼時候的準則:

  (1)不要試圖去假定垃圾收集發生的時間。這一切都是未知的。比方,方法中的一個暫時對象在方法調用完成後就變成了無用對象。這個時候它的記憶體就能夠被釋放。

  (2)Java中提供了一些和垃圾收集打交道的類。并且提供了一種強行運作垃圾收集的方法--調用System.gc(),但這相同是個不确定的方法。Java 中并不保證每次調用該方法就一定可以啟動垃圾收集,它僅僅隻是會向JVM發出這樣一個申請,究竟是否真正運作垃圾收集,一切都是個未知數。

  (3)挑選适合自己的垃圾收集器。一般來說,假設系統沒有特殊和苛刻的性能要求。能夠採用JVM的預設選項。否則能夠考慮使用有針對性的垃圾收集器,比方增量收集器就比較适合實時性要求較高的系統之中。系統具有較高的配置,有比較多的閑置資源。能夠考慮使用并行标記/清除收集器。

  (4)關鍵的也是難把握的問題是記憶體洩漏。良好的程式設計習慣和嚴謹的程式設計态度永遠是最重要的,不要讓自己的一個小錯誤導緻記憶體出現大漏洞。

  (5)盡早釋放無用對象的引用。

大多數程式猿在使用暫時變量的時候,都是讓引用變量在退出活動域(scope)後,自己主動設定為null。暗示垃圾收集器來收集該對象,還必須注意該引用的對象是否被監聽。假設有。則要去掉監聽器,然後再賦空值。

就是說,對于頻繁申請記憶體和釋放記憶體的操作,還是自己控制一下比較好,可是System.gc()的方法不一定适用,最好使用finallize強制運作或者寫自己的finallize方法。

================================================

tomcat

遇到TOMCAT出錯:java.lang.OutOfMemoryError: Java heap space,于是查了資料。找到了解決方法:

If Java runs out of memory, the following error occurs:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

Java heap size can be increased as follows:

java -Xms<initial heap size> -Xmx<maximum heap size>

Defaults are:

java -Xms32m -Xmx128m

假設你用win

/tomcat/bin/catalina.bat 加上以下的指令:

set JAVA_OPTS=-Xms32m -Xmx256m

假設你用unix/linux

/tomcat/bin/catalina.sh 加上以下的指令:

JAVA_OPTS="-Xms32m -Xmx256m"

=========================================

原因:

JVM堆的設定是指java程式執行過程中JVM能夠調配使用的記憶體空間的設定.JVM在啟動的時候會自己主動設定Heap size的值。其初始空間(即-Xms)是實體記憶體的1/64。最大空間(-Xmx)是實體記憶體的1/4。

能夠利用JVM提供的-Xmn -Xms -Xmx等選項可進行設定。

解決的方法:

tomcat_home/bin下catalina.bat(win)或catalina.sh(linux)執行代碼前加上:

set JAVA_OPTS=%JAVA_OPTS% -Xms128m -Xmx512m

=============================================================

eclipse java.lang.OutOfMemoryError: Java heap space 解決方式

===========================================================

eclipse 有啟動參數裡設定jvm大小,由于eclipse執行時自己也須要jvm,是以eclipse.ini裡設定的jvm大小不是詳細某個程式執行時所用jvm的大小,這和詳細程式執行的jvm大小無關。

那麼怎麼才幹設定某個程式的jvm大小呢(當然控制台執行的話不會存在這個問題。如:java -Xms256m -Xmx1024m classname,這樣就能夠把目前程式的jvm大小給設定)?

由于eclipse裡預設的一個程式的jvm配置為:-Xms8m -Xmx128m。是以我們的處理耗記憶體比較大時須要手動調整一下。以便不會記憶體溢出。詳細的設定方法為:

選中被執行的類。點選菜單‘Run as ->Open Run Dialog...’,選擇(x)=Argument标簽頁下的vm arguments框裡輸入 -Xmx512m, 儲存執行就ok了

=======================================================

Eclipse中java.lang.OutOfMemoryError: Java heap space

錯誤2007-06-12 11:53java.lang.OutOfMemoryError: Java heap space錯誤

在tomcat in的catalina.bat裡加

set JAVA_OPTS=-Xms256m -Xmx512m -Djava.awt.headless=true

256和512各自是MIN和MAX記憶體

在eclipse中的

windows->preferences..->tomcat->jvm..->jvm那一個文本框裡,加入-Xms256m -Xmx512m

這樣就能夠了!

==================================

Eclipse中VM設定方法 - [] - Tag:java.lang.OutOfMemoryError: Java heap space

點選右鍵,選擇run...。彈出窗體例如以下圖。在vm輸入框中填寫合适的記憶體值就可以。

eclipse中,黃線是警示。

private Log log = LogFactory.getLog(AddCateAction.class);//小黃線在log上。

這裡的黃線是指你定義了私有變量log,但沒實用到這個變量。

v.add(o); //這時eclipse以下出現了一個小黃線,表示仍然被引用?

這裡是指add方法是不推薦的方法。

OutOfMemoryError和懷疑的引用沒有關系。可能是循環建立對象導緻java記憶體不足。

用參數指定java虛拟機的記憶體.

java -Xms256m -Xmx1024m -XX:MaxPermSize=256M

========================================================

2、假設在啟動過程中出現記憶體溢出問題,抛出相似例如以下異常資訊:

能夠嘗試辦法:

A.改動Tomcat/bin/catalina.bat,加入例如以下内容

set JAVA_OPTS=-Xms256m -Xmx512m -Djava.awt.headless=true [-XX:MaxPermSize=128M]

B.eclipse->windows->preferences..->tomcat->jvm..->jvm文本框裡,加入-Xms256m -Xmx512m

C.eclipse->preference->java->instal jres->edit,添加參數:-Xms256m -Xmx512m

參考原因:JVM中假設98%的時間是用于GC且可用的, Heap size不足2%的時候将抛出此異常資訊。

JVM堆的設定是指java程式執行過程中JVM能夠調配使用的記憶體空間的設定.JVM在啟動的時候會自己主動設定Heap size的值,其初始空間(即-Xms)是實體記憶體的1/64,最大空間(-Xmx)是實體記憶體的1/4。

==================================================================

我的問題原因:

使用Spring+Hibernate從資料庫中讀取大量資料,使用了單例模式的AppContext的getBean,記憶體中緩存了大量的Entity Bean……

眼下仍沒有有效解決的方法,通過加大JVM記憶體大小,與變化資料讀取模式(如:剛看完實用資訊)緩解了一下。

變更資料讀取模式:

例如,一個EntityBean例如,下面的字段:id, name, age, address, description。

在此過程中使用的假設隻Bean的id和name場。是以隻是從資料庫中讀取這兩個領域,代替讀取整個bean以及相關聯的Bean。