服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

java内存溢出导致服务器死机之应急解决方案


  最近在做一个网站,使用的编程语言是jsp,web服务器采用resin-2.1.6发布,操作系统使用linux9.0,但是在网站运行过程中发现java可用内存越来越少,有时程序会报出java.lang.outofmemoryerror的错误,甚至导致resin死机。 
    其实这种现象在java语言中很正常,我们通常称之为java内存溢出。由于我们在java程序中声明了好多对象,占用了内存空间,程序结束时没有将这些对象或对象的引用进行释放,从而导致java虚拟机(jvm)进行垃圾回收(gc)时,不能够回收这些对象。这样,java所用的内存就会一直增加,直至溢出,进而导致resin死机。 
    导致java内存溢出的根本原因是java程序的不规范或不健壮。因此,从根本上解决java内存溢出的唯一方法就是修改java程序,及时地释放没用的对象,释放内存空间。 
    除了这个方法以外,还有一些应急措施,可以临时缓解一下系统的运行。resin默认情况是死机以后不能访问网站,必须手动重启resin,但不可能一直看在机器旁边,看resin有没有死机。所以这里介绍一种让resin自重启的方法。 
    打开resin的配置文件resin.conf(一般情况下,该文件在resin目录的conf文件夹下)。里面有一段内容如下所示: 
  <!-- 
     - ping to test if the web server is still up.  you can uncomment this 
     - and point it to pages on the webserver that exercise your main 
     - logic (like database access).  if the get fails, it will restart 
     - the server.  this will catch deadlocks, but not jdk freezes. 
     - <ping sleep-time=’1m’ retry-count=’3’ retry-time=’1s’> 
     -   <url>http://localhost:8080/ping/ping.jsp</url> 
     - </ping> 
   --> 
    这段内容默认情况下是被注释的。它的功能是让resin每隔一分钟就测试一下能否访问/ping/ping.jsp文件,测试时间是1s,如果不成功,就重试三次。如果三次都不成功,resin就自动重启。所以将这段话下半部分(从"<ping "到"</ping>")的注释去掉,然后在resin的发布目录中新建一个文件夹ping,在ping文件夹下新建一个ping.jsp文件,文件中可以写入简单的一句话,如:<% out.println("hello world");%>。 
   好,大功告成,启动resin,这样就不用担心java内存溢出导致resin死机了,因为resin死机后会马上重新启动。 
   当然,这只是应急措施,不是长久之计。如果从长计议,还是要耐心的更改java程序!!!

扫描关注微信公众号