问题描述
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