最近做项目碰到了让我纠结的问题,tomcat服务器运行一段时间,总是会自动报异常:java.lang.OutOfmemoryError: PermGen Space 的错误,导致项目无法正常运行。
介绍:
PermGen Space:指的是内存的永久保存区,该块内存主要是被JVM用来存放 class 和 mete 信息的,当 class 被加载 loader 的时候就会被存储到该内存区中,与存放类的实例的heap区不同,java中的 垃圾回收器GC 不会在主程序运行期对 PermGen space 进行清理。
原因:
当我们的应用中有很多的class时,很可能就会出现PermGen space的错误。
我们的 tomcat 在重启的时候,不是使用的 ./bin/shutdown.sh 而是使用 kill -9 xxx 直接杀掉,这样的话,存在 PermGen space 里面的内存不会被释放的,这样多长进行 kill 之后,就会导致系统的内存被渐渐吃完了,直到最后 tomcat 报错。
解决方法:
- 第一种方法:修改tomcat/bin目录下的catalina.bat。
在“rem ----- Execute The Requested Command ----------------------”下加入
JAVA_OPTS="-server -Xms800m -Xmx800m -XXNewSize=256M -XX:PermSize=256M -XX:MaxNewSize=512m -XX:MaxPermSize=512m"
这种方法在只使用tomcat时管用,但使用IDEA时不管用。
- 第二种方法:修改IDEA的Run Configurations。
点击“Run”-"Run Configurations",在打开的窗口中点击“Arguments”选项卡。
在VM arguments中内容最下边输入:
-Xms256m -Xmx512m -XX:MaxNewSize=256m -XX:MaxPermSize=256m
保存后再次重启后已经不再报错了。
网友评论