公司有一个项目,运行一阵子总是会报java.lang.OutOfMemoryError: PermGen space
一开始我以为是内存不足导致的,但是查看服务器内存还有很多。所以不是内存问题。
然后查到java运行时涉及到资源分配的几个重要参数:
- Xss:每个线程的stack大小(栈)
- Xmx:JAVA HEAP的最大值、默认为物理内存的1/4
- Xms:JAVA HEAP的初始值,server端最好Xms与Xmx一样
- Xmn:JAVA HEAP young区的大小
- XX:PermSize:设定内存的永久保存区域
- XX:MaxPermSize:设定最大内存的永久保存区域
而我遇到的问题正是permsize设置过小导致的。由于项目后期开发会越来越大,涉及到的类也会越来越多,导致虚拟机分配的资源不够类加载的使用。
----PermGen space的全称是Permanent Generation space,是指内存的永久保存区域
这个参数一旦分配了就不会改变。所以只要设置到足够项目使用的资源分配值就能解决问题了。
在这个过程中,我们可以使用java提供的命令来查看项目使用资源的具体情况,从而设定合适的资源分配,而不是过大浪费资源。
1 使用 ps -ef | grep java | grep '项目名' | awk $'{print $2}' 命令查出项目的pid
2 根据pid号 jmap -heap pid 查看项目具体使用资源情况
配置
使用
很明显可以看出目前的PermGen space 的内存是足够使用的。
以上就是解决问题的整体思路,下面是解决办法
到tomcat的bin目录下,找到catalina.sh (linux系统) 或者 catalina.bat (windows系统)
添加 JAVA_OPTS="-server -XX:PermSize=90M -XX:MaxPermSize=150m -Djava.awt.headless=true "
这里面的参数是根据你项目需求的资源分配的,不要分配过大,以免浪费资源,内存是宝贵的~
最后说一下就是jdk的这些参数都是需要做不同的优化的,一般情况下默认就可以运行了,但是为了后期项目的良好运行,最好能够对资源的分配做不同的调整。项目分开到独立的tomcat可以让项目的资源利用更加合理。