PermGen空间错误 - Glassfish服务器

dev*_*van 31 java memory-leaks exception glassfish

我正在使用Hibernate和glassfish Server运行java Web应用程序.我正进入(状态

java.lang.OutOfMemoryError: PermGen space 在我多次部署之后的异常.

我试过-XX:MaxPermSize=128M我的环境变量,但它不起作用.

vka*_*iya 47

要解决这个问题(在基于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,它应该开始.


Ing*_*gel 38

这是类加载器内存泄漏.每次重新部署应用程序时,都会为其创建一个新的类加载器,并再次加载应用程序的所有类.这消耗了perm gen空间中的内存.

旧的类加载器及其所有加载的类必须进行垃圾回收,否则在部署多次后最终会遇到PermGen空间OOME.如果由外部类加载器加载的对象持有对旧类加载器加载的任何对象的引用,则此方法不起作用.本文对该问题进行了很好的解释.

通常,类加载器泄漏很难分析,有时难以修复.要找出为什么旧的类加载器不是垃圾收集器,您必须使用分析器.在JProfiler中,使用堆walker,选择glassfish类加载器对象并使用传入引用视图来检查垃圾收集器根目录的路径.

调用类加载器类org.apache.servlet.jasper.JasperLoader.这是常规情况的屏幕截图,其中类加载器仅由加载对象的实时实例保存.

在此输入图像描述

在您的情况下,您应该看到来自外部对象的引用.Web容器中类加载器泄漏的另一个常见原因是未停止的后台线程.例如Google Guice在3.0中有这样的错误.

(免责声明:我的公司开发JProfiler)


avi*_*ano 10

如果您使用的是Windows,请尝试使用任务管理器终止glassfish进程(java.exe*32),然后重新启动服务器.