天天看点

idea热部署内存溢出:java.lang.OutOfMemoryError: PermGen space问题重现原因解决再次引申tomcat服务器内存溢出错误:OutOfMemoryError: PermGen spaceidea启动tomcat无效:Unable to ping server at localhost:1099IntelliJ IDEA / Tomcat - 内存溢出/内存优化最佳实践

Intellij IDEA一个贼优秀智能的IDE,自从eclipse转idea,就不想再使用eclipse了,不是一般的智能,其中一个特点就是它的热部署,修改了后台代码后可以热部署,不需要重新启动服务器。但是此前使用时多次热部署之后总是会报内存溢出的错误:java.lang.OutOfMemoryError: PermGen space

问题重现

错误如图:

idea热部署内存溢出:java.lang.OutOfMemoryError: PermGen space问题重现原因解决再次引申tomcat服务器内存溢出错误:OutOfMemoryError: PermGen spaceidea启动tomcat无效:Unable to ping server at localhost:1099IntelliJ IDEA / Tomcat - 内存溢出/内存优化最佳实践

有时候甚至系统报错:(运气好错误能够重现)

idea热部署内存溢出:java.lang.OutOfMemoryError: PermGen space问题重现原因解决再次引申tomcat服务器内存溢出错误:OutOfMemoryError: PermGen spaceidea启动tomcat无效:Unable to ping server at localhost:1099IntelliJ IDEA / Tomcat - 内存溢出/内存优化最佳实践

最后关闭服务器时可以看到有错误日志:

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
           
idea热部署内存溢出:java.lang.OutOfMemoryError: PermGen space问题重现原因解决再次引申tomcat服务器内存溢出错误:OutOfMemoryError: PermGen spaceidea启动tomcat无效:Unable to ping server at localhost:1099IntelliJ IDEA / Tomcat - 内存溢出/内存优化最佳实践

再次引申

这种方式的配置是每个项目都需要配置,那么可能有人说为什么不直接在tomcat的服务器相关的配置文件中配置呢?

对的,我就这么干过,可是事情不是那么简单,这里有我相关文章可以参看:

tomcat配置jvm参数:

tomcat服务器内存溢出错误:OutOfMemoryError: PermGen space

idea启动tomcat失败解决(由于配置了JVM参数):

idea启动tomcat无效:Unable to ping server at localhost:1099

那么总是会有一劳永逸的解决方案的,我想到的就是,既然idea有相关的jvm参数配置,那么我们直接修改它的默认值就好了。

这个参看另一篇博客:

idea设置JVM参数

这里放上对配置JVM内存参数的实践文章:

IntelliJ IDEA / Tomcat - 内存溢出/内存优化最佳实践