`
yunzhu
  • 浏览: 1146473 次
  • 性别: Icon_minigender_1
  • 来自: 南京
博客专栏
B2b19957-cda7-3a9e-83a0-418743feb0ca
监控应用服务器
浏览量:110072
2e8be8be-e51f-346c-bcdd-12623c9aa820
Web前端开发
浏览量:119849
Bfa5df64-a623-34b9-85b8-ef3ce2aed758
经典异常的解决
浏览量:204726
社区版块
存档分类
最新评论

异常: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了,问题解决了。

 

 

2
6
分享到:
评论
7 楼 yunzhu 2014-04-14  
lvwenwen 写道
同类型的线程加载A.jar,B.jar,这个同类型怎么理解,怎么控制线程不重复加载,请教下,谢谢

并入多个线程做的是同样的工作,比如监控WebLogic,需要用到weblogic.jar,那么这些线程只使用同一个类加载,不能每个线程使用单独的类加载器,也不需要担心同步问题
6 楼 lvwenwen 2014-04-13  
同类型的线程加载A.jar,B.jar,这个同类型怎么理解,怎么控制线程不重复加载,请教下,谢谢
5 楼 yunzhu 2013-12-23  
aspnetdb 写道
yunzhu 写道
buru 写道
”,因此,只要将这几个不同的ClassLoader实现复用,不就OK了吗?是的,然后同类型的线程使用同一个ClassLoader就行了,这样就不会重复加载相同的class了,问题解决了。


具体怎么做的,能详细说说吗,多谢!


就是我有一些线程使用自定义ClassLoader加载A.jar,有一些线程使用自定义ClassLoader加载B.jar,如果每个线程使用一个ClassLoader,那么A.jar和B.jar中的class就会被重复加载N次,就造成了文中所说的OutOfMemoryError错误,因此,我将加载A.jar的ClassLoader进行复用,将加载B.jar的ClassLoader也进行复用,A.jar和B.jar中的class就不会被重复加载了,就不会发生OutOfMemoryError错误了


那A.jar和B.jar假如有类冲突了怎么办?

我这里就是因为A.jar和B.jar的类冲突,还有A.jar跟JDK的类,所以才实现了自定义的类加载器
4 楼 aspnetdb 2013-12-23  
yunzhu 写道
buru 写道
”,因此,只要将这几个不同的ClassLoader实现复用,不就OK了吗?是的,然后同类型的线程使用同一个ClassLoader就行了,这样就不会重复加载相同的class了,问题解决了。


具体怎么做的,能详细说说吗,多谢!


就是我有一些线程使用自定义ClassLoader加载A.jar,有一些线程使用自定义ClassLoader加载B.jar,如果每个线程使用一个ClassLoader,那么A.jar和B.jar中的class就会被重复加载N次,就造成了文中所说的OutOfMemoryError错误,因此,我将加载A.jar的ClassLoader进行复用,将加载B.jar的ClassLoader也进行复用,A.jar和B.jar中的class就不会被重复加载了,就不会发生OutOfMemoryError错误了


那A.jar和B.jar假如有类冲突了怎么办?
3 楼 zhangli123123 2013-03-20  
2 楼 yunzhu 2011-05-09  
buru 写道
”,因此,只要将这几个不同的ClassLoader实现复用,不就OK了吗?是的,然后同类型的线程使用同一个ClassLoader就行了,这样就不会重复加载相同的class了,问题解决了。


具体怎么做的,能详细说说吗,多谢!


就是我有一些线程使用自定义ClassLoader加载A.jar,有一些线程使用自定义ClassLoader加载B.jar,如果每个线程使用一个ClassLoader,那么A.jar和B.jar中的class就会被重复加载N次,就造成了文中所说的OutOfMemoryError错误,因此,我将加载A.jar的ClassLoader进行复用,将加载B.jar的ClassLoader也进行复用,A.jar和B.jar中的class就不会被重复加载了,就不会发生OutOfMemoryError错误了
1 楼 buru 2011-05-07  
”,因此,只要将这几个不同的ClassLoader实现复用,不就OK了吗?是的,然后同类型的线程使用同一个ClassLoader就行了,这样就不会重复加载相同的class了,问题解决了。


具体怎么做的,能详细说说吗,多谢!

相关推荐

    Caused by: java.lang.OutOfMemoryError: PermGen space解决方案

    在Java应用程序运行过程中,"java.lang.OutOfMemoryError: PermGen space"错误是常见的一个问题,尤其是在使用Tomcat这样的Java应用服务器时。这个错误表明应用程序在 PermGen 区域(Permanent Generation)耗尽了...

    java.lang.OutOfMemoryError: PermGen space解决方案

    java.lang.OutOfMemoryError: PermGen space 解决方案

    java.lang.OutOfMemoryError: PermGen space及其解决方法

    当PermGen space的可用空间被耗尽时,Java应用程序将抛出`java.lang.OutOfMemoryError: PermGen space`异常。这种错误通常发生在应用程序加载了大量类或动态生成了很多类的情况下,例如使用了大量的第三方库或者在...

    tomcat内存溢出解决办法,错误信息:java.lang.OutOfMemoryError:PermGen space

    tomcat内存溢出解决办法,错误信息:java.lang.OutOfMemoryError:PermGen space 参考该文档可快速解决内存溢出的问题,服务器:tomcat

    Myeclipse下java.lang.OutOfMemoryError Java heap space的解决

    ### Myeclipse下java.lang.OutOfMemoryError: Java heap space的解决方案 在使用Myeclipse进行Java开发时,可能会遇到`java.lang.OutOfMemoryError: Java heap space`这个错误提示。这种异常通常发生在应用程序占用...

    java.lang.OutOfMemoryError解决办法

    当应用程序加载大量类或者使用了大量的静态变量和常量时,PermGen space可能会耗尽,从而引发`java.lang.OutOfMemoryError: PermGen space`错误。对于频繁部署或重载JSP的Web应用,如Tomcat,这个问题尤为常见。 ...

    java解决nested exception is java.lang.OutOfMemoryError Java heap space

    4. **调整PermGen空间**:在Java 8之前, PermGen 区域用于存储类的元数据,如果这个区域耗尽,会出现`java.lang.OutOfMemoryError: PermGen space`错误。在Java 8中,这部分被MetaSpace取代,可通过`-XX:...

    Eclipse中通过Tomcat运行J2EE项目java.lang.OutOfMemoryError PermGen space的解决方案

    当加载的类太多时,PermGen space 就会溢出,引发 java.lang.OutOfMemoryError: PermGen space 异常。 解决这个问题的关键是增加 JVM 的内存空间。有一些解决方案是针对纯 Tomcat 的情况,但是这些方法并不适合 ...

    java.lang.OutOfMemoryError处理错误

    在Tomcat中java.lang.OutOfMemoryError: PermGen space异常处理: 1. PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的。 2. Class在被Loader...

    java.lang.OutOfMemoryError: PermGen space

    在Java编程中,我们常常会遇到一个让人头疼的问题,那就是“java.lang.OutOfMemoryError: PermGen space”错误。这个错误提示表明,应用程序在运行过程中,内存的永久代(Permanent Generation)空间不足,导致了...

    Tomcat内存溢出的解决方法(java.util.concurrent.ExecutionException)

    5. **增大PermGen或Metaspace大小**:如果你看到 `OutOfMemoryError: PermGen space` 或 `Metaspace`,这是方法区溢出,可以通过 `-XX:MaxPermSize` (对于老版本JVM) 或 `-XX:MaxMetaspaceSize` (对于Java 8及以后...

    Tomcat给我的java.lang.OutOfMemoryError: PermGen

    本文将针对两种常见的Java内存溢出错误——`java.lang.OutOfMemoryError: PermGen space`和`java.lang.OutOfMemoryError: Java heap space`进行详细的分析和解决方案的探讨。 首先,我们来看`java.lang....

    完美解决java.lang.OutOfMemoryError处理错误的问题

    - **解决方法**:Java 8之后,PermGen被Metaspace取代,处理方式类似。可以增加 Metaspace 的大小(`-XX:MaxMetaspaceSize`),或者限制加载的类数量,避免频繁加载新类。 在针对`OutofMemoryError`进行故障排查时...

    OutOfMemoryError_8种典型案例分享

    当堆内存不足以容纳新对象时,就会抛出java.lang.OutOfMemoryError: Java heap space错误。常见的解决方法是增加-Xmx参数值以扩大堆内存的大小。除此之外,还可能是由于代码问题导致内存消耗过大,例如内存泄漏或是...

    内存不足OOM java.lang.OutOfMemoryError.

    Java中的“内存不足OOM (Out Of Memory):java.lang.OutOfMemoryError”是一个常见的运行时错误,它表示Java虚拟机(JVM)在尝试分配新的对象或数据结构时,发现系统内存不足以完成此操作。这个问题通常发生在程序...

    java.lang.OutOfMemoryError 错误整理及解决办法

    Java中的`java.lang.OutOfMemoryError`是一个严重的问题,它表示Java虚拟机(JVM)在尝试分配新的对象时没有足够的内存。这个错误通常会导致应用程序崩溃。本文将深入探讨这种错误的原因、常见类型以及解决策略。 *...

    eclipse常见报错

    1. Tomcat 服务器运行一段时间,总是会自动报异常:java.lang.OutOfmemoryError:PermGen Space 的错误。 解决方法:添加JVM参数:-Xms456m -Xmx556m -XX:PermSize=128m -XX:MaxPermSize=256m。如果是在 Tomcat 目录...

    Tomcat–Java.Lang.OutOfMemoryE

    标题 "Tomcat–Java.Lang.OutOfMemoryError" 指的是在使用Apache Tomcat服务器运行Java应用程序时出现的一种常见错误,即“Java.lang.OutOfMemoryError”,特别是涉及到“PermGen Space”区域的问题。 PermGen...

    关于java堆内存溢出的几种情况

    【情况三】:`java.lang.OutOfMemoryError: PermGen space` 此错误是因为持久代(PermGen)内存不足。在Java 8之前,PermGen用于存储类元数据和静态变量,当类加载过多或存在内存泄漏时可能发生溢出。解决方案是通过...

Global site tag (gtag.js) - Google Analytics