登录系统时,我在浏览器中出现以下错误
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)
答案 0 :(得分:2)
当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。