异常:java.lang.OutOfMemoryError: PermGen space
项目中遇到这么个异常:
java.lang.OutOfMemoryError: PermGen space
由于项目中使用了自定义的ClassLoader,用于加载不同版本的JAR包,每启一个线程都要使用单独的ClassLoader,线程多了ClassLoader当然也就多了,于是首当其冲就怀疑很可能是由于加载class过多导致的,因为虚拟机加载的class是从来不会释放的。
于是请教万能的谷兄,果不其然,且看一段解释:
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。
原来,正是由于每个ClassLoader加载的class都留在了PermGen space这个区域,而启的线程越多,加载的class也越多,造成很多class被重复加载,于是对PermGen space的占用呈几何级增长,溢出成为必然。
症结找到了,下面就要解决了:每个线程使用的ClassLoader并非完全没有雷同,实际上所有线程使用的ClassLoader也就那么几个是不同的,其他的都是这个几个的“拷贝”,因此,只要将这几个不同的ClassLoader实现复用,不就OK了吗?是的,然后同类型的线程使用同一个ClassLoader就行了,这样就不会重复加载相同的class了,问题解决了。
上一篇: Hibernate经典总结
下一篇: Java总结
推荐阅读
-
eclipse打开提示PermGen space异常该怎么办?
-
eclipse打开提示PermGen space异常该怎么办?
-
java中程序上线报错: tomcat中java.lang.OutOfMemoryError: PermGen space
-
Tomcat同时部署多个应用——内存溢出(java.lang.OutOfMemoryError: PermGen space)的解决办法
-
java.lang.OutOfMemoryError: PermGen space及其解决方法
-
ES内存溢出,报错:java.lang.OutOfMemoryError: Java heap space
-
java.lang.OutOfMemoryError: Java heap space 解决方法
-
java.lang.OutOfMemoryError: Java heap space解决方案
-
java.lang.OutOfMemoryError: Java heap space解决方法:即就该内存大小
-
java.lang.OutOfMemoryError: Java heap space 报错实例