最近开发了一个项目,现场总是抛出如下错误:
八月 22, 2016 2:27:29 下午 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet [frameWithoutSchema] in context with path [/IMAS] threw exception [Handler processing failed; nested exception is java.lang.OutOfMemoryError: Java heap space] with root cause
java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Unknown Source)
at java.io.ByteArrayOutputStream.grow(Unknown Source)
at java.io.ByteArrayOutputStream.ensureCapacity(Unknown Source)
at java.io.ByteArrayOutputStream.write(Unknown Source)
at org.apache.commons.net.io.Util.copyStream(Util.java:124)
at org.apache.commons.net.ftp.FTPClient._retrieveFile(FTPClient.java:1924)
at org.apache.commons.net.ftp.FTPClient.retrieveFile(FTPClient.java:1889)
at com.cws.utility.ApacheFTP.copyFile(ApacheFTP.java:495)
at com.cws.utility.ApacheFTP.copyDirectiory(ApacheFTP.java:467)
at com.cws.utility.ApacheFTP.copyDirectiory(ApacheFTP.java:469)
at com.cws.service.back.bussiness.ftp.FtpService.copyDirectory(FtpService.java:347)
at com.cws.service.back.bussiness.ftp.FtpService$$FastClassBySpringCGLIB$$911ce852.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:718)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:654)
at com.cws.service.back.bussiness.ftp.FtpService$$EnhancerBySpringCGLIB$$9a33a410.copyDirectory(<generated>)
at com.cws.controller.back.bussiness.guide.approve.ApproveController.saveEdit(ApproveController.java:216)
at com.cws.controller.back.bussiness.guide.approve.ApproveController$$FastClassBySpringCGLIB$$bfd90e04.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:718)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)
at com.cws.common.LogAspect.around(LogAspect.java:85)
at sun.reflect.GeneratedMethodAccessor256.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:621)
好吧,很明显的错误 :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.bat【windows服务器】,在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
set JAVA_OPTS=%JAVA_OPTS% -server -Xms800m -Xmx800m -XX:MaxNewSize=256m
或修改catalina.sh【linux服务器】
在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
JAVA_OPTS="$JAVA_OPTS -server -Xms800m -Xmx800m -XX:MaxNewSize=256m"
#############################################################
我项目是部署再了Windows虚拟机下的,tomcat7服务器使用的安装版的【因为方便】,设置如下:
#############################################################
这里一并记一下 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)那么就会产生此错误信息了。
解决方法:
1. 手动设置MaxPermSize大小
修改TOMCAT_HOME/bin/catalina.bat(Linux下为catalina.sh),在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=128M -XX:MaxPermSize=512m
catalina.sh下为:
JAVA_OPTS="$JAVA_OPTS -server -XX:PermSize=128M -XX:MaxPermSize=512m"
########################################################################
这个错误再web服务器上一般就不会出现啦,哪有经常在web服务器上对jsp compile的。
###########################################################################
PermGen space 一般是发生在程序员哥哥开发程序的时候,因为经常编辑jsp和java,所以一般情况下需要设置
Eclipse的。
解决方法: 手动设置MaxPermSize大小
步骤:
一 可以修改DeBug模式与Run模式
二 末未添加 (-Xms256m -Xmx512m -XX:MaxPermSize=256m)
注:依据你具体的内存大小,修改相应(-Xms,-Xmx)的值
不用设置太大,太大了也没什么用,我都电脑8G内存,设置如上面的就不抛PermGen space