Intellij IDEA一个贼优秀智能的IDE,自从eclipse转idea,就不想再使用eclipse了,不是一般的智能,其中一个特点就是它的热部署,修改了后台代码后可以热部署,不需要重新启动服务器。但是此前使用时多次热部署之后总是会报内存溢出的错误:java.lang.OutOfMemoryError: PermGen space
问题重现
错误如图:
有时候甚至系统报错:(运气好错误能够重现)
最后关闭服务器时可以看到有错误日志:
Error occurred during initialization of VM
Could not reserve enough space for object heap
了解到:在初始化虚拟机时出现问题,不能够给对象堆区预留足够的空间。
在此之前,都没有认真想要解决这个问题,因为重启服务器就好了,那时都是时间紧迫的学习中,现在才有时间梳理一些问题并记录。
原因
原因就是jvm的永久区内存设置的太小,堆(heap)区小了,所以当项目比较大时,各种使用内存,并且没有良好的规划对象生命周期或不恰当使用内存时,就很容易内存爆掉,最后给你死掉。当然具体了解JVM内存模型可以推荐看的书有《深入理解java虚拟机》,英文好的可以直接看 JVM规范 ,我是两者互相看,互相理解。
解决
那就是增加jvm对应的内存。毕竟我的机子是自己加了4G内存现在有8G,所以加大点运行内存也没事。
通过配置该项目的tomcat的vm options值配置:
-server -Xms128m -Xmx1024m -XX:PermSize=128m -XX:MaxNewSize=256m -XX:MaxPermSize=1024
再次引申
这种方式的配置是每个项目都需要配置,那么可能有人说为什么不直接在tomcat的服务器相关的配置文件中配置呢?
对的,我就这么干过,可是事情不是那么简单,这里有我相关文章可以参看:
tomcat配置jvm参数:
tomcat服务器内存溢出错误:OutOfMemoryError: PermGen space
idea启动tomcat失败解决(由于配置了JVM参数):
idea启动tomcat无效:Unable to ping server at localhost:1099
那么总是会有一劳永逸的解决方案的,我想到的就是,既然idea有相关的jvm参数配置,那么我们直接修改它的默认值就好了。
这个参看另一篇博客:
这里放上对配置JVM内存参数的实践文章:
IntelliJ IDEA / Tomcat - 内存溢出/内存优化最佳实践