java.lang.OutOfMemoryError: Java heap space 解決方法
本博客一搬家,新家地址: http://www.javaly.cn (Java樂園)
java.lang.OutOfMemoryError: Java heap space 解決方法
java.lang.OutOfMemoryError: Java heap space 解決方法
這個問題的根源是jvm虛擬機的默認Heap大小是64M,可以通過設置其最大和最小值來實現.設置的方法主要是幾個.
1.可以在windows 更改系統環境變量
加上JAVA_OPTS=-Xms64m -Xmx512m
加上JAVA_OPTS=-Xms64m -Xmx512m
2,如果用的tomcat,在windows下,可以在
C:\tomcat5.5.9\bin\catalina.bat 中加上:
set JAVA_OPTS=-Xms64m -Xmx256m
位置在: rem Guess CATALINA_HOME if not defined 這行的下面加合適.
3.如果是linux系統
Linux 在{tomcat_home}/bin/catalina.sh的前面,加
set JAVA_OPTS='-Xms64 -Xmx512'
################################################################
有三種可能導致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服務器,在這個服務器的啟動文件后面加上這個參數即可。
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at org.jaxen.expr.IdentitySet.contains(IdentitySet.java:73)
at org.jaxen.expr.DefaultStep.evaluate(DefaultStep.java:165)
at org.jaxen.expr.DefaultLocationPath.evaluate(DefaultLocationPath.java:
154)
at org.jaxen.expr.DefaultAbsoluteLocationPath.evaluate(DefaultAbsoluteLo
cationPath.java:117)
at org.jaxen.expr.DefaultXPathExpr.asList(DefaultXPathExpr.java:108)
at org.jaxen.BaseXPath.selectNodesForContext(BaseXPath.java:705)
at org.jaxen.BaseXPath.selectNodes(BaseXPath.java:227)
at org.dom4j.xpath.DefaultXPath.selectNodes(DefaultXPath.java:132)
at org.dom4j.tree.AbstractNode.selectNodes(AbstractNode.java:166)
at com.sunland.jdata.Pm01XmlFactory.readSourceData(Pm01XmlFactory.java:1
20)
at com.sunland.jdata.Pm01XmlFactory.readSourceDataDir(Pm01XmlFactory.jav
a:95)
at com.sunland.operation.Pm01DbBean.done(Pm01DbBean.java:28)
at com.sunland.factory.Pm01Task.doCreate(Pm01Task.java:44)
at com.sunland.factory.Pm01Task.run(Pm01Task.java:31)
at com.sunland.jdata.MainStart.main(MainStart.java:69)
Linux 在{tomcat_home}/bin/catalina.sh的前面,加
set JAVA_OPTS='-Xms64 -Xmx512'
################################################################
內存溢出 java.lang.OutOfMemoryError: Java heap space
有三種可能導致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服務器,在這個服務器的啟動文件后面加上這個參數即可。
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at org.jaxen.expr.IdentitySet.contains(IdentitySet.java:73)
at org.jaxen.expr.DefaultStep.evaluate(DefaultStep.java:165)
at org.jaxen.expr.DefaultLocationPath.evaluate(DefaultLocationPath.java:
154)
at org.jaxen.expr.DefaultAbsoluteLocationPath.evaluate(DefaultAbsoluteLo
cationPath.java:117)
at org.jaxen.expr.DefaultXPathExpr.asList(DefaultXPathExpr.java:108)
at org.jaxen.BaseXPath.selectNodesForContext(BaseXPath.java:705)
at org.jaxen.BaseXPath.selectNodes(BaseXPath.java:227)
at org.dom4j.xpath.DefaultXPath.selectNodes(DefaultXPath.java:132)
at org.dom4j.tree.AbstractNode.selectNodes(AbstractNode.java:166)
at com.sunland.jdata.Pm01XmlFactory.readSourceData(Pm01XmlFactory.java:1
20)
at com.sunland.jdata.Pm01XmlFactory.readSourceDataDir(Pm01XmlFactory.jav
a:95)
at com.sunland.operation.Pm01DbBean.done(Pm01DbBean.java:28)
at com.sunland.factory.Pm01Task.doCreate(Pm01Task.java:44)
at com.sunland.factory.Pm01Task.run(Pm01Task.java:31)
at com.sunland.jdata.MainStart.main(MainStart.java:69)