我正在使用Hibernate和glassfish Server运行java Web应用程序。我正在
在我多次部署之后 java.lang.OutOfMemoryError: PermGen space
异常。
我在环境变量中尝试-XX:MaxPermSize=128M
,但它不起作用。
答案 0 :(得分:46)
要解决此问题(在基于linux的操作系统中),请执行以下操作
1)增加内存(以便不会经常出现此问题)通过在
中配置“domain.xml”/的glassfish /域/域1 /配置
搜索
<jvm-options>-XX:MaxPermSize=
set it to higher value eg- 198m or 256m
2)杀死glassfish进程以释放它运行的端口(在我的情况下是8686 ) 打开终端(在基于linux的操作系统中)并输入 -
sudo netstat -npl | grep 8686
这将导致类似......
tcp6 0 0 :::8686 :::* LISTEN 3452/java
下次使用
kill -9 3452
杀死这个过程(在这种情况下为3452)
现在尝试启动glassfish,它应该开始。
答案 1 :(得分:38)
这是类加载器内存泄漏。每次重新部署应用程序时,都会为其创建一个新的类加载器,并再次加载应用程序的所有类。这消耗了perm gen空间中的内存。
旧的类加载器及其所有加载的类必须进行垃圾回收,否则在部署多次后最终会遇到PermGen空间OOME。如果由外部类加载器加载的对象持有对旧类加载器加载的任何对象的引用,则此方法不起作用。 This article对问题给出了很好的解释。
通常,类加载器泄漏很难分析,有时难以修复。 要找出为什么旧的类加载器不是垃圾收集器,您必须使用分析器。在JProfiler中,使用堆walker,选择glassfish类加载器对象并使用传入的引用视图来检查垃圾收集器根的路径。
类加载器类名为org.apache.servlet.jasper.JasperLoader
。这是常规情况的屏幕截图,其中类加载器仅由加载对象的实时实例保存。
在您的情况下,您应该看到来自外部对象的引用。 Web容器中类加载器泄漏的另一个常见原因是未停止的后台线程。例如Google Guice在3.0中有这样的错误。
(免责声明:我公司开发JProfiler)
答案 2 :(得分:10)
如果您使用的是Windows,请尝试使用任务管理器终止glassfish进程(java.exe * 32),然后重新启动服务器。
答案 3 :(得分:4)
多次迭代部署会发生此问题。我曾经多次面对这个问题。请参阅以下JIRA链接了解glassfish bug: