Linux环境,中间件tomcat,jdk1.7,webapps下部署一个web应用,启动正常,部署两个web应用,启动报:java.lang.OutOfMemoryError: PermGen space
修改catalina.sh文件,具体路径:/tomcat/apache-tomcat-7.0.85/bin
找到JAVA_OPTS参数,指定-XX:MaxPermSize和-XX:PermSize
JAVA_OPTS="-server -Xms4096m -Xmx4096m -XX:MaxPermSize=512M -XX:PermSize=512M -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Addresses -verbose:gc -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintHeapAtGC -XX:+PrintGCTimeStamps -XX:+HeapDumpOnOutOfMemoryError"
JVM参数基本概念——引用 https://blog.csdn.net/zhou_andy/article/details/54906621
其他参考链接:https://wenku.baidu.com/view/8b879e2e4b73f242326c5f04.html
http://www.cnblogs.com/xwdreamer/archive/2011/11/21/2296930.html
1、JVM的内存
JVM的内存 = 年轻代(Young) + 年老代(Tenured) + 持久代
-Xms: 设置初始JVM内存大小
-Xmx: 设置最大JVM内存大小
一般讲Xms, Xmx设置成一样的大小,避免超过Xms后,内存重新整理;另外,由于由于jvm进程本身会占用内存空间,所以jvm实际占用的内存空间会比设置的大
-Xmn: 设置年轻代内存大小(一般设置为Xmx的1/3)
年轻代包括两个区,Edgen 和 Survivor 区,Suvrvior区还被平均分成了两块 from space 和 to space,默认情况下 Edgen与2个Survior大小比例 8:2, 即一个survivor占据
1/10的年轻代内存大小。可以通过-XX:SurviorRatio=X 修改Edgen与Survior的大小比例
老年代的大小无法设置,等于 JVM内存-年轻代-持久代;如果未指定-Xmn参数,可以通过-XX:NewRatio=X设置年轻代和年老代的比例,默认1:2, 即年轻代占据除去持久代内存的1/3
-XX:PermSize=256M: 持久代初始内存大小
-XX:MaxPermSize=512M: 最大持久代内存大小,一般不需要设置很大,可以在程序运行一段时间后,通过jconsole进行查看,从而调整持久代的初始值及最大值
2、其它参数
-server: 在linux上默认是开启的,windows上要手动设置
-XX:+UseG1GC: -Xmx设置超过4g时,建议开启;一般采用 -XX:+UseConcMarkSweepGC
垃圾回收期,有个名词STW: stop the world, 就是垃圾回收器在执行回收动作时,JVM会停止所有动作,即不做任何其它的事情,如果时间较长,将出现程序停止现象
-Djava.awt.headless=true: 在服务器上使用时,一般开启
3、举个例子
1)JAVA_OPTS="$JAVA_OPTS -Xms6g -Xmx6g -Xmn2g -Xss1024K-XX:PermSize=256M -XX:MaxPermSize=1g -Djava.awt.headless=true -XX:+UseG1GC "
2)JAVA_OPTS="$JAVA_OPTS -Xms2g -Xmx2g -Xmn700M -Xss512K -XX:PermSize=256M -XX:MaxPermSize=512M -Djava.awt.headless=true -XX:+UseConcMarkSweepGC"