jetty插件java.lang.OutOfMemoryError: PermGen space内存溢出

项目运行时,有时遇到java.lang.OutOfMemoryError: PermGen space问题。
例如启动线程异步导入excel、excel导出时,会出现如上问题。
原因分析:
PermGen space,全称是Permanent Generation space,指的是内存中的永久区域。当java中间件启动时,会将相关的jar包和.class加载到永久区域,而用就区域的空间是固定的,虽然可以设置。报这个错的原因就是在启动加载.class时,永久区域溢出了。
项目具体分析:异步导入excel会启动线程、请求多次后线程一直等待、资源没有释放。另外excel导出时本项目会调用很多资源。开发过程中默认配置分配的空间不足。服务器部署一般内存很大,同样情况下没有出现OutOfMemoryError异常。所以本地开发需要修改jvm的参数。
开发中处理:
设置run as --->run configuragtions--->jre标签下的属性VM arguments:
-Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M

参考说明:
1.参数的含义
-vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M
-vmargs 说明后面是VM的参数,所以后面的其实都是JVM的参数了
-Xms128m JVM初始分配的堆内存
-Xmx512m JVM最大允许分配的堆内存,按需分配

-XX:PermSize=64M JVM初始分配的非堆内存
-XX:MaxPermSize=128M JVM最大允许分配的非堆内存,按需分配

2.堆内存分配
JVM初始分配的堆内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的堆内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;
空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx 相等以避免在每次GC 后调整堆的大小。
说明:如果-Xmx 不指定或者指定偏小,应用可能会导致java.lang.OutOfMemory错误,此错误来自JVM,不是Throwable的,无法用try...catch捕捉。

3.非堆内存分配
JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。

4.JVM内存限制(最大值)
首先JVM内存限制于实际的最大物理内存,假设物理内存无限大的话,JVM内存的最大值跟操作 系统有很大的关系。简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制,
这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),而64bit以上的处理器就不会有限制了。

你可能感兴趣的:(jetty插件java.lang.OutOfMemoryError: PermGen space内存溢出)