Java PermGen空间错误-Glassfish服务器
我正在使用Hibernate和glassfish服务器运行java web应用程序。我越来越Java PermGen空间错误-Glassfish服务器,java,exception,memory-leaks,glassfish,Java,Exception,Memory Leaks,Glassfish,我正在使用Hibernate和glassfish服务器运行java web应用程序。我越来越 java.lang.OutOfMemoryError:PermGen空间在我多次部署后出现异常 我在我的环境变量中尝试了-XX:MaxPermSize=128M,但它不起作用。迭代部署多次会出现此问题。我已经面对过很多次了。请参考以下有关glassfish bug的JIRA链接: 这是类加载器内存泄漏。每次重新部署应用程序时,都会为其创建一个新的类加载器,并再次加载应用程序的所有类。这会消耗永久发电机空
java.lang.OutOfMemoryError:PermGen空间
在我多次部署后出现异常
我在我的环境变量中尝试了
-XX:MaxPermSize=128M
,但它不起作用。迭代部署多次会出现此问题。我已经面对过很多次了。请参考以下有关glassfish bug的JIRA链接:
这是类加载器内存泄漏。每次重新部署应用程序时,都会为其创建一个新的类加载器,并再次加载应用程序的所有类。这会消耗永久发电机空间中的内存 旧的类加载器及其所有加载的类都必须进行垃圾收集,否则在多次部署之后,最终将运行到PermGen空间OOME中。如果外部类加载器加载的对象持有对旧类加载器加载的任何对象的引用,则这不起作用。很好地解释了这个问题 一般来说,类加载器泄漏很难分析,有时也很难修复。 要找出旧类加载器没有被垃圾收集的原因,必须使用探查器。在中,使用heap walker,选择glassfish类加载器对象,并使用incoming references视图检查垃圾收集器根的路径 类加载器类称为
org.apache.servlet.jasper.JasperLoader
。下面是一个常见情况的屏幕截图,其中类装入器仅由装入对象的活动实例持有
在您的情况下,您应该看到来自外部对象的引用。web容器中类加载器泄漏的另一个常见原因是未停止的后台线程。例如,GoogleGuice在3.0中就有这样一个bug
(免责声明:我的公司开发了JProfiler)要解决这个问题(在基于linux的操作系统中),请执行以下操作
1) 通过在中配置“domain.xml”来增加内存(这样这个问题就不会经常出现)
/glassfish/domain/domain1/config
寻找
-XX:MaxPermSize=
将其设置为更高的值,例如-198m或256m
2) 杀死glassfish进程以释放它运行的端口(在我的例子中是8686)
打开终端(在基于linux的操作系统中)并键入-
sudo netstat-npl | grep 8686
这将导致类似
tcp6 0:::8686::*收听3452/java
下次使用
kill-93452
终止该进程(本例中为3452)
现在尝试启动glassfish,它应该会启动。如果您使用的是Windows,请尝试使用任务管理器终止glassfish进程(java.exe*32),然后重新启动服务器。这就是您要找的:您看到错误报告的年份了吗?!这就是为什么我们不喜欢答案中的链接。检查。链接死了!答案没有任何价值,这是完美的