WEB Server
  当前位置:首页 > 技术支持 > WEB Server
java.lang.OutOfMemoryError系列
发布时间:2011-07-16 浏览:2363次
  
 
 

环境:tomcat5.5以上、struts1.2以上、hibernate3.0以上 运行在linux as 4.0

问题出现后tomcat就无法运行,在网络中查询这个错误有不同的解释,但大致相同。综合大家的一起贴出来以备后用:

初步确定原因
   1,java虚拟机jvm内存过小
   2,程序不严密,产生太多的垃圾

解决对策:
   针对原因1:
     增加jvm的内存大小。
     JVM即是java虚拟机,它运行时候占用一定的内存,其大小是有限定的,如果程序在运行时jvm占用的内存大于某个限度,则会产生内存益处,也就是“java.lang.outofmemoryerror”。
     作为web容器的tomcat(包括resin等)在运行时候,会直接或间接产生一个java.exe进程,可以看成一个jvm进程。由于这些web容器在不停的运行,也就是jvm不停的工作,jvm会不断的产生垃圾(所胃的垃圾,简单可认为是指程序进行后遗留下的无用的对象),也会不停的回收垃圾。当回收垃圾的速度比产生垃圾的速度的慢时,垃圾就会不停的增长,当垃圾增长超过一定限度,也就是垃圾对象占用的内存超过jvm内存的最大限度。此时jvm就会出现运行时错误,也就是error,由于error属于致命错误,不能处理,故tomcat等就会断掉,只有重启tomcat。
    针对此,我们可以设想,如果jvm内存的没有限度,并且有无限大的内存,那jvm就永远不会出现内存溢出了。但是,傻子都知道我们在做白日梦。既然这样行不通,那我们就退一步,所胃退一步海阔天空嘛,我们可以适当增? ?jvm的最大内存,以缓解jvm来不及回收垃圾而导致的内存不断增长。jdk1.4默认jvm的最大内存为128M,我们可以把tomcat等web容器的jvm最大内存加大,比如我们可以增大到256M,甚至1G等,只要不超过计算的内存都行,不过凡事都有个度,设置过大肯定不是最好的。至于要个jvm设置多大的内存则要通过我们不断尝试。
   如何增加jvm的内存呢?
   第一,在执行某个class文件时候,可以使用java -Xmx256M aa.class来设置运行aa.class时jvm所允许占用的最大内存为256M。
   第二,对tomcat容器,可以在启动时对jvm设置内存限度。对tomcat,可以在catalina.bat中添加:
"set CATALINA_OPTS=-Xms128M -Xmx256M
   set JAVA_OPTS=-Xms128M -Xmx256M",或者把%CATALINA_OPTS%和%JAVA_OPTS%代替为-Xms128M -Xmx256M,其具体操作可以到网上去找找。
    第三,对resin容器,同样可以在启动时对jvm设置内存限度。在bin文件夹下创建一个startup.bat文件,内容如下:
@echo off
call "httpd.exe"   "-Xms128M" "-Xmx256M"
:end
其中"-Xms128M"为最小内存,"-Xmx256M"为最大内存。
    第四? ?其他容器,如ibm webswhere,可以通过配置文件加大jvm内存。
    第五,修改jdk内核,个人想法,但没去研究过。

   针对原因2:
     由于jvm产生的垃圾是由我们所写的代码产生的,质量好的代码产生的垃圾少,相反就会产生很多垃圾。由于jvm的最大内存不能无限增大,故增大jvm的最大内存应该是在代码已经达到很优化时才实施的,所以优化程序才是我们最先要做的。
     如何优化程序:
     第一,避免死循环。仔细检查程序,防止出现死循环,这是比较容易检查的。
     第二,可以适当手动回收垃圾
    第三,应该及时释放种资源:内存, 数据库的各种连接。
释放资源的时候不能依赖于java的垃圾自动回收机制,最好也不要用finalize方法,因为无用单元回收不是一个完全可以确定的过程,作为低优先级进程,往往是系统没有内存时才调用垃圾回收进程。

java.lang.OutOfMemoryError: PermGen space

1、

PermGen space的全称是Permanent Generation space,是指内存的永久保存区域OutOfMemoryError: PermGen space从表面上看就是内存益出,解决方法也一定是加大内存。说说为什么会内存益出:这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。这种错误常见在web服务器对JSP进行pre compile的时候。

改正方法:-Xms256m -Xmx256m -XX:MaxNewSize=256m -XX:MaxPermSize=256m

2、

在tomcat中redeploy时出现outofmemory的错误.

可以有以下几个方面的原因:

1,使用了proxool,因为proxool内部包含了一个老版本的cglib.

2, log4j,最好不用,只用common-logging

3, 老版本的cglib,快点更新到最新版。

4,更新到最新的hibernate3.2

3、

这里以tomcat环境为例,其它WEB服务器如jboss,weblogic等是同一个道理。
一、java.lang.OutOfMemoryError: PermGen space

PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,
这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,
它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对
PermGen space进行清理,所以如果你的应用中有很多CLASS的话,就很可能出现PermGen space错误,
这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小
超过了jvm默认的大小(4M)那么就会产生此错误信息了。
解决方法: 手动设置MaxPermSize大小

修改TOMCAT_HOME/bin/catalina.sh
在“echo "Using CATALINA_BASE:    $CATALINA_BASE"”上面加入以下行:
JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m
建议:将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样可以达到减少jar 文档重复占用内存的目的。

二、java.lang.OutOfMemoryError: Java heap space
Heap size 设置
JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值,
其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可
进行设置。Heap size 的大小是Young Generation 和Tenured Generaion 之和。
提示:在JVM中如果98%的时间是用于GC且可用的Heap size 不足2%的时候将抛出此异常信息。
提示:Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。
解决方法:手动设置Heap size
修改TOMCAT_HOME/bin/catalina.sh
在“echo "Using CATALINA_BASE:    $CATALINA_BASE"”上面加入以下行:
JAVA_OPTS="-server -Xms800m -Xmx800m    -XX:MaxNewSize=256m"

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

JAVA_OPTS="-server -Xms800m -Xmx800m   -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true "

 
 
    
 
 
版权所有 © 2005-2024 安徽省艾佳信息技术有限公司 皖ICP备06002923号  皖公网安备 34019202000659号
地址:安徽省合肥市蜀山区望江西路69号西湖国际广场 电话:0551-64935878 邮箱:admin@ajsoft.cn