這個(gè)問(wèn)題的根源是jvm虛擬機(jī)的默認(rèn)Heap大小是64M,可以通過(guò)設(shè)置其最大和最小值來(lái)實(shí)現(xiàn).設(shè)置的方法主要是幾個(gè).
位置在: rem Guess CATALINA_HOME if not defined 這行的下面加合適.
3.如果是linux系統(tǒng)
Linux 在{tomcat_home}/bin/catalina.sh的前面,加
set JAVA_OPTS='-Xms64 -Xmx512'
################################################################
內(nèi)存溢出 java.lang.OutOfMemoryError: Java heap space
有三種可能導(dǎo)致OutOfMemoryError。首先是,此JVM有真實(shí)的內(nèi)存泄漏,導(dǎo)致此JVM堆在內(nèi)部實(shí)現(xiàn)時(shí)產(chǎn)生了一個(gè)Bug。這極不可靠。所有JVM都經(jīng)過(guò)充分的測(cè)試,并且,如果有人發(fā)現(xiàn)這種bug,它將絕對(duì)是最高的優(yōu)先級(jí)。因此你可以非常寬心地排除這種可能性。
第二種可能的OutOfMemoryError原因只不過(guò)是,你沒(méi)有為你的應(yīng)用程序運(yùn)行時(shí)給予足夠多的可用內(nèi)存。這種情況,有兩種可能的方案,或者增加
JVM堆可用大小,或者減少你的應(yīng)用程序所需的內(nèi)存總量。提高JVM可用堆大小可以簡(jiǎn)單的使用JVM的 -Xmx
參數(shù)。假如你將此參數(shù)設(shè)置盡可能的大(可用內(nèi)存極限不要超過(guò)系統(tǒng)物理內(nèi)存,否則你的應(yīng)用程序?qū)⒎猪?yè)并暫停),仍然有以上所提到的內(nèi)存問(wèn)題,那么,你需要減
少你的應(yīng)用程序所可能用到內(nèi)存總量。減少應(yīng)用程序內(nèi)存可能是簡(jiǎn)單的,你可能允許一些集合過(guò)大,例如使用了許多大的緩沖區(qū)。或者它過(guò)于復(fù)雜,要求你重新實(shí)現(xiàn)
一些類,乃至重新設(shè)計(jì)應(yīng)用程序。
讀者 Jams Stauffer 指出有些JVM(例如 sun的
JVMs),還有一個(gè)“Perm”參數(shù)用來(lái)處理JVM結(jié)構(gòu)與類對(duì)象。如果你正在使用一個(gè)數(shù)量非常巨大的類集,它有可能運(yùn)行在"Perm"空間之外,然后你
需要增加此空間的大小,例如,sun的JVM使用 -XX:PermSize 與 -XX:MaxPermSize 選項(xiàng)。
第三種導(dǎo)致OutOfMemoryError最為常見(jiàn),無(wú)心的對(duì)象引用保持。你沒(méi)有明確無(wú)誤的釋放對(duì)象,以致于你的堆增長(zhǎng)再增長(zhǎng),直到你沒(méi)有額外的空間。
處理OutOfMemoryError:
是JVM內(nèi)部的BUG?不太可能。如果是,這是優(yōu)先級(jí)最高的BUG(為什么還沒(méi)有人發(fā)現(xiàn)它,而你碰到了?)。
沒(méi)有足夠的內(nèi)存分配給實(shí)際運(yùn)行的應(yīng)用程序??jī)煞N選擇:使用-Xmx參數(shù)增加堆的最大使用內(nèi)存(或者使用-XX:MaxPermSize參數(shù)增加Perm空
間大小); 或者使用更小的集合/緩沖區(qū)/表空間/對(duì)象.....,以減少所需要的內(nèi)存總量,也就是說(shuō),可以調(diào)整對(duì)象大小,重新設(shè)計(jì)與重新實(shí)現(xiàn)你的應(yīng)用程
序。
無(wú)心的對(duì)象引用保持?找到保持這些無(wú)意引用的源對(duì)象,改變它并釋放這些對(duì)象。在IBM開(kāi)發(fā)者社區(qū)的文章綱要式的揭示了這樣一個(gè)通用的處理過(guò)程。這個(gè)過(guò)程主
要是等到應(yīng)用程序到達(dá)恒定狀態(tài)--你將期望最多的新創(chuàng)建的對(duì)象是臨時(shí)對(duì)象,并且可以被垃圾收集器收集。這常常是在應(yīng)用程序所有的初始化工作完成之后。
強(qiáng)迫垃圾收集,獲得一個(gè)堆的對(duì)象快照。
做任何工作可能正在導(dǎo)到無(wú)意的對(duì)象引用保持。
強(qiáng)迫另一次垃圾收集并獲得第二次堆的對(duì)象快照。
比較這兩個(gè)快照,觀察從第一個(gè)快照到第二個(gè)快照哪些對(duì)象在數(shù)量上有所增加。因?yàn)槟阍诳煺罩皬?qiáng)迫垃圾收集,剩下的將是所有被應(yīng)用程序引用的對(duì)象,比較兩個(gè)快照將準(zhǔn)確的標(biāo)識(shí)那些新創(chuàng)建的、保留在應(yīng)用程序里的對(duì)象。
根據(jù)你對(duì)應(yīng)用程序的認(rèn)識(shí),決定兩個(gè)快照比較中,哪些對(duì)象正在無(wú)意的保持對(duì)象引用。
跟蹤前導(dǎo)引用,找到哪些對(duì)象正在引用這些無(wú)意的保持對(duì)象,直到你找到導(dǎo)致此問(wèn)題的源對(duì)象
啟動(dòng)虛擬機(jī)的時(shí)候,加上一個(gè)參數(shù):-Xms800m -Xmx800m就好了
-Xms <size>
設(shè)置JVM初始化堆內(nèi)存大小
-Xmx <size>
設(shè)置JVM最大的堆內(nèi)存大小
如果是應(yīng)用程序,則:java -Xms800m -Xmx800m 你的類名
如果是tomcat之類的web服務(wù)器,在這個(gè)服務(wù)器的啟動(dòng)文件后面加上這個(gè)參數(shù)即可。
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)