PermGen 空间错误 - 玻璃鱼服务器

2022-09-01 10:08:50

我正在使用Hibernate和glassfish Server运行java Web应用程序。我得到

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

我尝试使用环境变量,但它不起作用。-XX:MaxPermSize=128M


答案 1

要解决这个问题(在基于Linux的操作系统中),请执行以下操作

1)通过在中配置“域.xml”来增加内存(以便此问题不会频繁出现)

/glassfish/domain/domain1/config

寻找

<jvm-options>-XX:MaxPermSize=

set it to higher value eg- 198m or 256m

2)杀死玻璃鱼进程以释放它正在运行的端口(在我的情况下是8686)开放终端(在基于linux的操作系统中)并键入 -

sudo netstat -npl | grep 8686

这将导致类似..

tcp6 0 0 :::8686 :::* LISTEN 3452/java

下次使用

kill -9 3452杀死该进程 ( 3452 在这种情况下 )

现在尝试启动玻璃鱼,它应该开始。


答案 2

这是类装入器内存泄漏。每次重新部署应用程序时,都会为其创建一个新的类装入器,并再次装入应用程序的所有类。这会消耗烫发生成空间中的内存。

旧的类装入器及其所有装入的类都必须进行垃圾回收,否则在多次部署后,您最终会遇到PermGen空间OOME。如果由外部类装入器装入的对象包含对旧类装入器装入的任何对象的引用,则这不起作用。本文很好地解释了这个问题。

通常,类加载器泄漏很难分析,有时也很难修复。要找出为什么旧的类装入器没有被垃圾回收,你必须使用探查器。在 JProfiler 中,使用堆步行器,选择 glassfish 类加载器对象,然后使用传入引用视图来检查垃圾回收器根目录的路径。

类装入器类称为 。下面是常规情况的屏幕截图,其中类装入器仅由已装入对象的实时实例持有。org.apache.servlet.jasper.JasperLoader

enter image description here

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

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