重新部署时出现NetBeans/Glassfish和PermGen空间错误(是的,仍在发生)



我知道这个问题以前可能被问过很多次,但我仍然没有看到真正的解决方案。

我的日常发展环境如下:1.NetBeans(最新),2。玻璃鱼(最新与NB捆绑在一起),3。JPA、JSF、JAXB、用于JAX-RS 的Jersey

我的项目中有大约600个类,分布在两个EJB项目和一个WAR项目中,所有这些都在一个EAR中。

我使用的是最新的JDK7(在OSX上),我每小时都会遇到臭名昭著的"PermGen空间"错误。比方说,如果我每分钟进行3次增量重新部署,我只能在此之前工作一小段时间:

  • Glassfish的PermGen空间用完了,所以我只能终止这个过程
  • 由于我增加了最大置换空间,部署变得非常缓慢(正如S.O.上的几十个答案中建议的那样)

通常唯一的解决方案是每30分钟左右杀死一次glassfish。这肯定是由于某个地方的错误,它只是为每次新的增量重新部署加载新的类,而不是删除旧的类。我以为这应该在JDK7中修复?

在这种开发环境中,这是一个长期存在的错误,我很震惊,在我5年多的Java开发之后,它仍然存在。这太令人沮丧了,而且毫无成效。

就在有人建议增加永久空间之前,相信我,我已经尝试过了,它唯一"解决"的就是延长不可避免的时间。我见过重新部署最糟糕的时候需要400秒。对于这样规模的项目,重新部署应该需要5-6秒,不再需要了。)

EDIT:在完成以下步骤后,我在Glassfish进程上运行jmap和jhat:

  1. 启动玻璃鱼
  2. 部署我的EA
  3. 取消部署我的EA
  4. 然后用jmap做了一个堆转储

事实证明,我所有的类(本应卸载)仍然被加载!希望这对阅读本文的人来说是有用的信息。。。

当然,这是一个错误,我认为没有简单的解决方案。(如果有的话,可能你已经吃过了)。

您可以尝试的是:使用一些热代码替换工具,例如JRebel,这样您就不必一直部署,而是该工具监视.class文件(甚至其他web资源,如果您这样配置的话)的更改,并且替换运行的JVM中的类定义。听起来很酷,对吧?

它作为Java代理工作,它在JVM启动时启动。

这个解决方案有3个缺点:部署有点慢,更难调试,而且它是一个专有软件(但成本不高)

当使用Netbeans+Glassfish进行开发并使用"保存时部署"时,我们发现在重新部署项目时,打包在应用程序中的库不会被卸载;这会导致GF速度减慢并迅速耗尽内存。

尝试为所有编译时库取消选择"Package",并将那些尚未在domainX/lib目录的Glassfish类路径中的库放置。

不确定,但这可能与GLASSFISH-17449或GLASSFISH-16283有关。

最新更新