<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[Heck's  Blog]]></title> 
<link>https://www.heckjj.com/index.php</link> 
<description><![CDATA[一瞬间的决定，往往可以改变很多，事实上，让自己成功的往往不是知识，是精神！ 如果你总是为自己找借口，那只好让成功推迟。执行力，今天！]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[Heck's  Blog]]></copyright>
<item>
<link>https://www.heckjj.com/java-Out-Of-Memory-Error/</link>
<title><![CDATA[Java程序中内存溢出的解决方法]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[编程杂谈]]></category>
<pubDate>Mon, 20 Sep 2010 18:15:14 +0000</pubDate> 
<guid>https://www.heckjj.com/java-Out-Of-Memory-Error/</guid> 
<description>
<![CDATA[ 
	<span style="font-family: 微软雅黑;"><span style="font-size: 14px;"><strong><span style="color: #4169E1;">内存溢出的原因</span></strong></span><br/><br/>有三种可能导致OutOfMemoryError。首先是，此JVM有真实的内存泄漏，导致此JVM堆在内部实现时产生了一个Bug。这极不可靠。所有JVM都经过充分的测试，并且，如果有人发现这种bug，它将绝对是最高的优先级。因此你可以非常宽心地排除这种可能性。<br/><br/>第二种可能的OutOfMemoryError原因只不过是，你没有为你的应用程序运行时给予足够多的可用内存。这种情况，有两种可能的方案，或者增加 JVM堆可用大小，或者减少你的应用程序所需的内存总量。提高JVM可用堆大小可以简单的使用JVM的 -Xmx 参数。假如你将此参数设置尽可能的大（可用内存极限不要超过系统物理内存，否则你的应用程序将分页并暂停），仍然有以上所提到的内存问题，那么，你需要减少你的应用程序所可能用到内存总量。减少应用程序内存可能是简单的，你可能允许一些集合过大，例如使用了许多大的缓冲区。或者它过于复杂，要求你重新实现一些类，乃至重新设计应用程序。<br/><br/>有些JVM还有一个“Perm”参数用来处理JVM结构与类对象。如果你正在使用一个数量非常巨大的类集，它有可能运行在"Perm"空间之外，然后你需要增加此空间的大小，例如，sun的JVM使用 -XX:PermSize 与 -XX:MaxPermSize 选项。<br/><br/>第三种导致OutOfMemoryError最为常见，无心的对象引用保持。你没有明确无误的释放对象，以致于你的堆增长再增长，直到你没有额外的空间。</span>[font=微软雅黑]<br/><br/><span style="font-size: 14px;"><strong><span style="color: #4169E1;">处理OutOfMemoryError:</span></strong></span><br/>是JVM内部的BUG？不太可能。如果是，这是优先级最高的BUG（为什么还没有人发现它，而你碰到了？）。<br/><br/>&nbsp;&nbsp; 没有足够的内存分配给实际运行的应用程序？两种选择：使用-Xmx参数增加堆的最大使用内存（或者使用-XX:MaxPermSize参数增加Perm空间大小）;　或者使用更小的集合/缓冲区/表空间/对象.....，以减少所需要的内存总量，也就是说，可以调整对象大小，重新设计与重新实现你的应用程序。<br/><br/>无心的对象引用保持？找到保持这些无意引用的源对象，改变它并释放这些对象。在IBM开发者社区的文章纲要式的揭示了这样一个通用的处理过程。这个过程主要是等到应用程序到达恒定状态－－你将期望最多的新创建的对象是临时对象，并且可以被垃圾收集器收集。这常常是在应用程序所有的初始化工作完成之后。<br/><br/>强迫垃圾收集，获得一个堆的对象快照。<br/>做任何工作可能正在导到无意的对象引用保持。<br/>强迫另一次垃圾收集并获得第二次堆的对象快照。<br/>比较这两个快照，观察从第一个快照到第二个快照哪些对象在数量上有所增加。因为你在快照之前强迫垃圾收集，剩下的将是所有被应用程序引用的对象，比较两个快照将准确的标识那些新创建的、保留在应用程序里的对象。<br/>根据你对应用程序的认识，决定两个快照比较中，哪些对象正在无意的保持对象引用。<br/>跟踪前导引用，找到哪些对象正在引用这些无意的保持对象，直到你找到导致此问题的源对象<br/><br/>启动虚拟机的时候，加上一个参数：-Xms800m -Xmx800m就好了 <br/>-Xms <size> <br/>设置JVM初始化堆内存大小 <br/><br/>-Xmx <size> <br/>设置JVM最大的堆内存大小 <br/><br/>如果是应用程序，则：java -Xms800m -Xmx800m 你的类名 <br/>如果是tomcat之类的web服务器，在这个服务器的启动文件后面加上这个参数即可<br/><br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content"><br/>Exception in thread "main" java.lang.OutOfMemoryError: Java heap space<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at org.jaxen.expr.IdentitySet.contains(IdentitySet.java:73)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at org.jaxen.expr.DefaultStep.evaluate(DefaultStep.java:165)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at org.jaxen.expr.DefaultLocationPath.evaluate(DefaultLocationPath.java:<br/>154)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at org.jaxen.expr.DefaultAbsoluteLocationPath.evaluate(DefaultAbsoluteLo<br/>cationPath.java:117)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at org.jaxen.expr.DefaultXPathExpr.asList(DefaultXPathExpr.java:108)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at org.jaxen.BaseXPath.selectNodesForContext(BaseXPath.java:705)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at org.jaxen.BaseXPath.selectNodes(BaseXPath.java:227)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at org.dom4j.xpath.DefaultXPath.selectNodes(DefaultXPath.java:132)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at org.dom4j.tree.AbstractNode.selectNodes(AbstractNode.java:166)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at com.sunland.jdata.Pm01XmlFactory.readSourceData(Pm01XmlFactory.java:1<br/>20)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at com.sunland.jdata.Pm01XmlFactory.readSourceDataDir(Pm01XmlFactory.jav<br/>a:95)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at com.sunland.operation.Pm01DbBean.done(Pm01DbBean.java:28)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at com.sunland.factory.Pm01Task.doCreate(Pm01Task.java:44)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at com.sunland.factory.Pm01Task.run(Pm01Task.java:31)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at com.sunland.jdata.MainStart.main(MainStart.java:69)</div></div><br/><span style="font-size: 14px;"><strong><span style="color: #4169E1;">解决方法:</span></strong></span><br/>1、设置环境变量<br/><br/> set JAVA_OPTS= -Xms64m -Xmx512m<br/><br/>可以根据自己机器的内存进行更改,但本人测试这种方法并没有解决问题。可能是还有哪里需要设置。<br/><br/>2、java -Xms32m -Xmx800m className<br/><br/>就是在执行JAVA类文件时加上这个参数，其中className是需要执行的确类名。（包括包名）<br/>这个解决问题了。而且执行的速度比没有设置的时候快很多。<br/><br/>3.eclipse 有启动参数里设置jvm大小，因为eclipse运行时自己也需要jvm,所以eclipse.ini里设置的jvm大小不是具体某个程序运行时所用jvm的大小，这和具体程序运行的jvm大小无关。<br/><br/>那么怎么才能设置某个程序的jvm大小呢（当然控制台运行的话不会存在这个问题，如:java -Xms256m -Xmx1024m classname，这样就可以把当前程序的jvm大小给设定）？<br/><br/>因为eclipse里默认的一个程序的jvm配置为：-Xms8m -Xmx128m，所以我们的处理耗内存比较大时需要手动调整一下，以便不会内存溢出。具体的设置方法为：<br/>选中被运行的类，点击菜单‘run->run...’，选择(x)=Argument标签页下的vm arguments框里输入 -Xmx512m, 保存运行就ok了 <br/>Tags - <a href="https://www.heckjj.com/tags/java/" rel="tag">java</a> , <a href="https://www.heckjj.com/tags/%25E5%2586%2585%25E5%25AD%2598%25E6%25BA%25A2%25E5%2587%25BA/" rel="tag">内存溢出</a>
]]>
</description>
</item><item>
<link>https://www.heckjj.com/java-Out-Of-Memory-Error/#blogcomment</link>
<title><![CDATA[[评论] Java程序中内存溢出的解决方法]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://www.heckjj.com/java-Out-Of-Memory-Error/#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>