問題描述
Exception in thread "main" java.lang.OutOfMemoryError: Java heap spacehtml
解決方案[轉]
一直都知道能夠設置jvm heap大小,一直用eclipse寫/調試java程序。一直用命令行or console加參數跑程序。現象:在eclipse的配置文件eclipse.ini中設置-vmargs -Xms500m -Xmx1024m,在eclipse中直接run 或者debug某些耗內存的程序時依然出現java.lang.OutOfMemoryError: Java Heap Space錯誤,即一般認爲的內存不足,java虛擬機內存不夠用。而在命令行加這些參數則有效果,不會出錯。這說明一個問題,這些參數根本沒有起做用。今天須要在eclipse裏調試程序,還沒到須要調試的地方就heap error了,在網上搜了不少地方,獲得了最終的答案:
選中被運行的類,點擊菜單‘run->run...’,選擇(x)=Argument標籤頁下的vm arguments框裏
輸入 -Xmx800m, 保存運行。
原來還須要對每一個project單獨設置,汗...
有三種可能致使OutOfMemoryError。首先是,此JVM有真實的內存泄漏,致使此JVM堆在內部實現時產生了一個Bug。這極不可靠。全部JVM都通過充分的測試,而且,若是有人發現這種bug,它將絕對是最高的優先級。所以你能夠很是寬心地排除這種可能性。
第二種可能的OutOfMemoryError緣由只不過是,你沒有爲你的應用程序運行時給予足夠多的可用內存。這種狀況,有兩種可能的方案,或者增長 JVM堆可用大小,或者減小你的應用程序所需的內存總量。提升JVM可用堆大小能夠簡單的使用JVM的 -Xmx 參數。假如你將此參數設置儘量的大(可用內存極限不要超過系統物理內存,不然你的應用程序將分頁並暫停),仍然有以上所提到的內存問題,那麼,你須要減 少你的應用程序所可能用到內存總量。減小應用程序內存多是簡單的,你可能容許一些集合過大,例如使用了許多大的緩衝區。或者它過於複雜,要求你從新實現 一些類,乃至從新設計應用程序。
讀者 Jams Stauffer 指出有些JVM(例如 sun的 JVMs),還有一個「Perm」參數用來處理JVM結構與類對象。若是你正在使用一個數量很是巨大的類集,它有可能運行在"Perm"空間以外,而後你 須要增長此空間的大小,例如,sun的JVM使用 -XX:PermSize 與 -XX:MaxPermSize 選項。
第三種致使OutOfMemoryError最爲常見,無意的對象引用保持。你沒有明確無誤的釋放對象,以至於你的堆增加再增加,直到你沒有額外的空間。
處理OutOfMemoryError:
是JVM內部的BUG?不太可能。若是是,這是優先級最高的BUG(爲何尚未人發現它,而你碰到了?)。
沒有足夠的內存分配給實際運行的應用程序?兩種選擇:使用-Xmx參數增長堆的最大使用內存(或者使用-XX:MaxPermSize參數增長Perm空 間大小); 或者使用更小的集合/緩衝區/表空間/對象.....,以減小所須要的內存總量,也就是說,能夠調整對象大小,從新設計與從新實現你的應用程 序。
無意的對象引用保持?找到保持這些無心引用的源對象,改變它並釋放這些對象。在IBM開發者社區的文章綱要式的揭示了這樣一個通用的處理過程。這個過程主 要是等到應用程序到達恆定狀態--你將指望最多的新建立的對象是臨時對象,而且能夠被垃圾收集器收集。這經常是在應用程序全部的初始化工做完成以後。
強迫垃圾收集,得到一個堆的對象快照。
作任何工做可能正在導到無心的對象引用保持。
強迫另外一次垃圾收集並得到第二次堆的對象快照。
比較這兩個快照,觀察從第一個快照到第二個快照哪些對象在數量上有所增長。由於你在快照以前強迫垃圾收集,剩下的將是全部被應用程序引用的對象,比較兩個快照將準確的標識那些新建立的、保留在應用程序裏的對象。
根據你對應用程序的認識,決定兩個快照比較中,哪些對象正在無心的保持對象引用。
跟蹤前導引用,找到哪些對象正在引用這些無心的保持對象,直到你找到致使此問題的源對象
啓動虛擬機的時候,加上一個參數:-Xms800m -Xmx800m就行了
-Xms <size>
設置JVM初始化堆內存大小
-Xmx <size>
設置JVM最大的堆內存大小
若是是應用程序,則:java -Xms800m -Xmx800m 你的類名
若是是tomcat之類的web服務器,在這個服務器的啓動文件後面加上這個參數便可。
另外設置環境變量
JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true "java
參考來源
http://hi.baidu.com/dearfenix/blog/item/1b0ce80e64ca12ce7bcbe109.html
http://hi.baidu.com/%C2%ED%D3%C0/blog/item/90d9e5033663118bd43f7c2a.html
http://www.chq.name/content/view/306_2.htmlweb