java中内存溢出的处理方法

转载 2011年01月12日 17:25:00
标签: java  分类: Web技术 2008-05-01 16:33
有三种可能导致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)

相关文章推荐

java 中三种常见内存溢出错误的处理方法

一、PermGen space 二、Java heap space 三、unable to create new native thread

java中三种常见内存溢出错误的处理方法

好的基础知识要转载,原文链接此处相信有一定java开发经验的人或多或少都会遇到OutOfMemoryError的问题,这个问题曾困扰了我很长时间,随着解决各类问题经验的积累以及对问题根源的探索,终于有...

Java常见的几种内存溢出及解决方法

Java常见的几种内存溢出及解决方法【情况一】: java.lang.OutOfMemoryError:Javaheapspace:这种是java堆内存不够,一个原因是真不够(如递归的层数太多等),...

Java常见的几种内存溢出及解决方法

Java常见的几种内存溢出及解决方法.

内存溢出java.lang.OutOfMemoryError解决方法

解决办法: 一、java.lang.OutOfMemoryError: PermGen space PermGen space的全称是Permanent Generation space,...
  • mylutte
  • mylutte
  • 2016年03月23日 13:10
  • 135

Java常见的内存溢出异常及解决方法

Java的内存溢出,主要是两方面的异常:堆内存溢出、非堆内存溢出。 一、 java.lang.OutOfMemoryError: Java heap space。 Heap size 设置 JVM...
  • cyq1984
  • cyq1984
  • 2011年05月04日 23:32
  • 2711

Struts2中内存溢出(java.lang.OutOfMemoryError)异常错误介绍和解决方法

1.在我以前写得关于Struts2的文章中,有时候往往会报一些经常出现的错误,今天又出现了,所以特此来介绍一下,并如何解决这种错误。 2.在我们部署项目到Tomcat服务器后,开启T...

java项目内存溢出解决方法

原文地址:http://blog.163.com/caojuan_cju/blog/static/12611951220099532853396/ 原因 :内存容易溢出可以说是因为在程序中有内存泄漏...

常见Java内存溢出与解决方法详解

Java programming language具有目前大部分编程语言所共有的一些特征,被特意设计用于互联网的分布式环境。Java具有类似于C++语言的"形式和感觉",但它要比C++语言更易于使用,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java中内存溢出的处理方法
举报原因:
原因补充:

(最多只允许输入30个字)