关于java.lang.OutOfMemoryError:java heap space错误解决方案

 //首先检查程序有没 有限入死循环 

  这个问题主要还是由这 个问题 java.lang. OutOfMemor yError: Java heap space 引起的。第一次出现这 样的的问题以后,引发 了其他的问题。在网上 一查可能是JAVA的 堆栈设置太小的原因。  

  跟据网上的答案大致有 这两种解决方法: 

  1、设置环境变量 

  解决方法:手动设置H eap size 

  修改TOMCAT_H OME/bin/ca talina.sh 

  set JAVA_OPTS=  -Xms32m -Xmx512m 

  可以根据自己机器的内 存进行更改。 

  2、java -Xms32m -Xmx800m className 

  就是在执行JAVA类 文件时加上这个参数, 其中classNam e是需要执行的确类名 。(包括包名) 

  这个解决问题了。而且 执行的速度比没有设置 的时候快很多。 

  如果在测试的时候可能 会用Eclispe 这时候就需要在Ecl ipse ->run -arguments  中的VM arguments 中输入-Xms32m  -Xmx800m这个 参数就可以了。 

  后来在Eclilps e中修改了启动参数, 在VM arguments 加入了-Xms32m  -Xmx800m,问 题解决。 

  一、java.lan g.OutOfMem oryError: PermGen space  

  PermGen space的全称是P ermanent Generation  space,是指内存 的永久保存区域, 

  这块内存主要是被JV M存放Class和M eta信息的,Cla ss在被Loader 时就会被放到Perm Gen space中, 

  它和存放类实例(In stance)的He ap区域不同,GC( Garbage Collection )不会在主程序运行期 对 

  PermGen space进行清理, 所以如果你的应用中有 很多CLASS的话, 就很可能出现Perm Gen space错误, 

  这种错误常见在web 服务器对JSP进行p re compile的时候 。如果你的WEB APP下都用了大量的 第三方jar, 其大小 

  超过了jvm默认的大 小(4M)那么就会产 生此错误信息了。 

  解决方法: 手动设置MaxPer mSize大小 

  修改TOMCAT_H OME/bin/ca talina.sh 

  在“echo "Using CATALINA_B ASE:   $CATALINA_ BASE"”上面加入 以下行: 

  JAVA_OPTS= "-server -XX:PermSi ze=64M -XX:MaxPer mSize=128m  

  建议:将相同的第三方 jar文件移置到to mcat/share d/lib目录下,这 样可以达到减少jar  文档重复占用内存的目 的。 

  二、java.lan g.OutOfMem oryError: Java heap space 

  Heap size 设置 

  JVM堆的设置是指j ava程序运行过程中 JVM可以调配使用的 内存空间的设置.JV M在启动的时候会自动 设置Heap size的值, 

  其初始空间(即-Xm s)是物理内存的1/ 64,最大空间(-X mx)是物理内存的1 /4。可以利用JVM 提供的-Xmn -Xms -Xmx等选项可 

  进行设置。Heap size 的大小是Young Generation  和Tenured Generaion 之和。 

  提示:在JVM中如果 98%的时间是用于G C且可用的Heap size 不足2%的时候将抛出 此异常信息。 

  提示:Heap Size 最大不要超过可用物理 内存的80%,一般的 要将-Xms和-Xm x选项设置为相同,而 -Xmn为1/4的- Xmx值。  

  解决方法:手动设置H eap size 

  修改TOMCAT_H OME/bin/ca talina.sh 

  在“echo "Using CATALINA_B ASE:   $CATALINA_ BASE"”上面加入 以下行: 

  JAVA_OPTS= "-server -Xms800m -Xmx800m   -XX:MaxNew Size=256m"  

  三、实例,以下给出1 G内存环境下java  jvm 的参数设置参考: 

  JAVA_OPTS= "-server -Xms800m -Xmx800m -XX:PermSi ze=64M -XX:MaxNew Size=256m -XX:MaxPer mSize=128m  -Djava.awt .headless= true " 

  很大的web工程,用 tomcat默认分配 的内存空间无法启动, 如果不是在myecl ipse中启动tom cat可以对tomc at这样设置: 

  TOMCAT_HOM E\bin\cata lina.bat 中添加这样一句话: 

  set JAVA_OPTS=  -Xmx1024M -Xms512M -XX:MaxPer mSize=256m  

  如果要在myecli pse中启动,上述的 修改就不起作用了,可 如下设置: 

  Myeclipse- >preferenc es->myecli pse->serve rs->tomcat ->tom cat×.×->JD K面板中的 

  Optional Java VM arguments中 添加:-Xmx102 4M -Xms512M -XX:MaxPer mSize=256m   海柳 烟嘴 正品

  在myeclipse 中启动Tomcat时 ,提示"ava.la ng.OutOfMe moryError:  Java heap space",解决办 法就是: 

  Myeclipse- >preferenc es->myecli pse->serve rs->tomcat ->tom cat×.×->JD K面板中的 

  Optional Java VM arguments中 添加:-Xmx102 4M -Xms512M -XX:MaxPer mSize=256m  

  //以上是转载  

  我遇到的错误是在my eclipse中启动 Tomcat时,提示 "ava.lang. OutOfMemor yError: Java heap space" 

  以上三点我都试过了 就是不知道自己的代码 从哪里进入死循环  我运用的是strut s,hibernat e,spring 

  根据错误提示JSON Write 找到自己项目下poj o下hibernat e的映射文件 

  eg: 

  有两张关联的表 生成两个相联的实体类  和映射文件 PersonInfo mation和Sta teOffice 

  因为映射文件和实体类 是从数据库表自动生成 的  所以都是自动生成双向 的关系 

  在PersonInf omation中pr ivate PersStateO ffice persStateO ffice; 

  并且在StateOf fice中priva te Set<PersPe rsonInform ation> persPerson Informatio ns = new HashSet<Pe rsPersonIn formation>

  0); 

  所以在封装json数 据的时候就会出现死循 环现象 不断的从两个实体类中 封装 导致内存溢出 

  解决方案 1 取消StateOff ice中的关联 2手动封装json数 据(为了不让查询数据 出现错误与冲突 我选择手动封装jso n数据) 

  eg://获取任职类 型 

  public String loadOffice Type() throws Exception { 

  PrintWrite r out = response.g etWriter()

  typeOffice List=offic eTypeServi ce.getOffi ceType(); 

  out.print( "{typeOffi ceList:[")

  for(int i=0;i<type OfficeList .size();i+ +){ 

  out.print( "{typeOffi ceId:'"+ty peOfficeLi st.get(i).  getTypeOff iceId()+"' ,"); 

  out.print( "typeOffic e:'"+typeO fficeList. get(i).get  TypeOffice ()+"'}"); 

  if(i!=type OfficeList .size()-1)

  out.print( ","); 

  } 

  } 

  out.print( "]}"); 

  return null; 

  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值