JavaWeb项目运行期间验证码不显示解决方案
前言
-
场景描述
线上项目部署在Tomcat容器上,刚启动时验证码正常显示,运行一段时间后,验证码无法显示,查看日志发现打印堆内存溢出。
java.lang.OutOfMemoryError: Java heap space
解决思路
-
解决步骤
-
使用jdk安装目录下bin目录自带的jvisualvm查看内存使用情况。
-
使用jprofiler分析。
-
查看Linux服务器内存使用情况。
free -h
-
对Tomcat进行调优
-
解决过程
手动设置Heap Size大小
```sh
# Windows下修改 TOMCAT_HOME/bin/catalina.bat
## 在“echo Using CATALINA_BASE: "%CATALINA_BASE%"”上面加入以下行:
set JAVA_OPTS=%JAVA_OPTS% -server -Xms800m -Xmx800m -XX:MaxNewSize=256m
# Linux下修改 TOMCAT_HOME/bin/catalina.sh
## 在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
JAVA_OPTS="$JAVA_OPTS -server -Xms800m -Xmx800m -XX:MaxNewSize=256m"
## 或
JAVA_OPTS="-server -Xms800m -Xmx800m -XX:MaxNewSize=256m"
# 替换后catalina.sh后,启动startup.sh失败
# 在tomcat的bin目录下执行指令:chmod +x *.sh,然后再次启动
```
-Djava.awt.headless=true
-
第二天项目验证码再次显示失败
查看tomcat目录logs目录下localhost.2019-04-30.log日志发现生成验证码的servlet报错
严重: Servlet.service() for servlet generateCode threw exception java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11GraphicsEnvironment
-
修改Heap Size配置
# Linux下修改 TOMCAT_HOME/bin/catalina.sh ## 方案一 exec "$_RUNJAVA" $JAVA_OPTS $CATALINA_OPTS \ -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \ -Dcatalina.base="$CATALINA_BASE" \ -Dcatalina.home="$CATALINA_HOME" \ -Djava.io.tmpdir="$CATALINA_TMPDIR" \ ### 在尾部加上一句: -Djava.awt.headless=true \ ### 启动时报异常:http://www.cnblogs.com/aigongsi/archive/2012/04/11/2442774.html ## 方案二 ### 在首行加上(保留之前配置) JAVA_OPTS="-Xms256m -Xmx512m -Xss1024K -XX:PermSize=128m -XX:MaxPermSize=256m -Djava.awt.headless=true" ### 正常启动
参考链接
-
待更新
https://www.cnblogs.com/zzblee/p/4038370.html
-
关于Eclipse中一个错误排查总结
http://www.cnblogs.com/aigongsi/archive/2012/04/11/2442774.html