1.场景在线:
jenkins构建成功,项目部署到tomcat中,但是页面访问竟然报404错误(但是项目确实存在于项目中),查看tomcat日志,发现出现了OutOfMemoryError报错,由于项目比较紧,就重启了tomcat,页面恢复了正常
2.查找关于造成这个问题的原因:OutOfMemoryError
3.关于java的内存jvm重新认识:
1) java内存可以分为堆内存和非堆内存
堆是给开发人员用的,是在JVM启动时创建;
非堆是留给JVM自己用的,用来存放类型(类和接口)的信息。
两个的区别:它和堆不同,运行期内GC不会释放空间。如果web app用了大量的第三方jar或者应用有太多的class文件而恰好MaxPermSize设置较小,超出了也会导致这块内存的占用过多造成溢出,或者 tomcat热部署时侯不会清理前面加载的环境,只会将context更改为新部署的,非堆存的内容就会越来越多,热部署上几次就java.lang.OutOfMemoryError: PermGen space .
2)内存设置信息:
---- 堆内存设置:程序可以到达的,可以操作的
-Xms 初始堆内存 默认物理内存1/64,也是最小分配堆内存,当空余堆内存小于40%时,会增加到-Xms的最大限制
-Xmx 最大堆内存分配 默认物理内存1/4,当空余堆内存大于70%时,会减小到-Xms的最小限制。
一般设置 -Xms和Xms大小相等
设置Tomcat启动的初始内存其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4
---- 非堆内存设置
-XX:PermSize 非堆内存的初始值,默认物理内存的1/64 ,也是最小非堆内存。
-XX:MaxPermSize 非堆内存最大值,默认物理内存的1/4
-XX:MaxNewSize tomcat对自身堆栈的新的最大的分配;当tomcat内存不足时,调用此分配;从而达到调优的目的
-XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m
3)经典JVM参数设置:
java -Xmx128m -Xms128m -Xmn64m -Xss1m
4)tomcat中在linux中jvm的设置:
----------------------Linux下修改TomcatJVM内存大小----------------------
要添加在tomcat 的bin 下catalina.sh 里,位置cygwin=false前 。注意引号要带上,红色的为新添加的.
OS specific support. $var must be set to either true or false.
JAVA_OPTS="-Xms256m -Xmx512m -Xss1024K -XX:PermSize=128m -XX:MaxPermSize=256m"
cygwin=false
----------------------windows下修改Tomcat JVM内存大小----------------------
解压版本的Tomcat , 要通过startup.bat启动tomcat才能加载配置
要添加在tomcat 的bin 下catalina.bat 里
rem Guess CATALINA_HOME if not defined
set CURRENT_DIR=%cd%后面添加,红色的为新添加的.
set JAVA_OPTS=-Xms256m -Xmx512m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m -Djava.awt.headless=true