如何修复PermGen内存问题

时间:2015-04-27 07:15:53

标签: java java-ee memory out-of-memory permgen

登录系统时,我在浏览器中出现以下错误

  

java.lang.RuntimeException:javax.servlet.ServletException:   java.lang.OutOfMemoryError:PermGen空间     com.opensymphony.sitemesh.webapp.decorator.BaseWebAppDecorator.render(BaseWebAppDecorator.java:39)     com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:84)

4 个答案:

答案 0 :(得分:2)

java.lang.OutOfMemoryError

  

当Java虚拟机无法分配对象时抛出,因为   内存不足,没有更多的内存可供使用   垃圾收集器。 OutOfMemoryError对象可以由。构造   如果禁用抑制和/或堆栈跟踪,则虚拟机   是不可写的。

增加JVM的堆大小

通过使用命令行选项可以增加JVM分配的堆大小这里我们有3个选项

-Xms<size>        set initial Java heap size
-Xmx<size>        set maximum Java heap size
-Xss<size>        set java thread stack size

PermGen中OutofMemory的常见原因是ClassLoader。每当将类加载到JVM中时,其所有元数据以及类加载器都保存在PermGen区域,并且当加载它们的类加载器准备好进行垃圾回收时,它们将被垃圾收集。在案例类中,类加载器有一个内存泄漏,它所加载的所有类都将保留在内存中,并且一旦重复几次就会导致permGen outofmemory。

现在有两种方法可以解决这个问题: 1.找出内存泄漏的原因或是否有任何内存泄漏。 2.使用JVM参数-XX增加PermGen Space的大小:MaxPermSize和-XX:PermSize。

答案 1 :(得分:0)

使用运行时参数优化程序或增加Java堆大小。( - Xxx)

答案 2 :(得分:0)

java.lang.OutOfMemoryError:PermGen space

两步解决方案。

第一步:更改应用程序启动配置并添加(或增加(如果存在)-XX:MaxPermSize参数。这是一个临时步骤,好像这是一个实时系统,很可能额外的内存也将在未来的某个时间被填充。但这将解决现在的错误。

第二步:释放不必要的资源。确保关闭所有数据库连接。明智地加载和卸载类。您编程的结构一次只能处理少量数据。分析并修复内存泄漏

答案 3 :(得分:0)

重要的是要知道PermGenError是在每次解复后发生,还是在几次解复后发生。

如果是第一种情况,只需增加PermGen的内存大小即可。

如果是第二个,你的代码中就会有一些死牛。在这种情况下,增加内存大小只会推迟错误,因为每次部署后内存的大小仍在增加。您必须使用jvisualvm(here is nice tutorial)对您的应用进行分析,并找到一些死牛。重要的是要理解,PermGenError不是关于类本身,而是关于classLoaders(Classloader leaks: the dreaded "java.lang.OutOfMemoryError: PermGen space" exception)。

在我的案例中(Glssfish服务器),问题是添加到Web应用程序的Log4j2库。我还必须将它们添加到服务器库( domain-dir / lib ),以便根据它们在Common classLoader加载的Glassfish Class Loaders Hierarchy