2

我知道这可能已经被问过很多次了,但我仍然没有看到它的实际修复。

我的日常开发环境如下: 1. NetBeans(最新),2. Glassfish(与 NB 捆绑的最新),3. JPA、JSF、JAXB、Jersey for JAX-RS

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

我使用的是最新的 JDK 7(在 OS X 上),并且每小时都会收到臭名昭著的“PermGen 空间”错误。假设我每分钟进行 3 次增量重新部署,我只能工作一小会儿:

  • Glassfish 用完了 PermGen 空间,所以我只需要终止该进程。
  • 由于我增加了最大 permgen 空间,部署变得非常缓慢(建议从 SO 上的几十个答案中做一个)

通常唯一的解决方案是每 30 分钟左右杀死一次玻璃鱼。这绝对是由于某个地方的错误,它只是为每次新的增量重新部署加载新类,而不是摆脱旧的。我认为这应该在 JDK 7 中修复?

在这种开发环境中,这是一个长期存在的错误,在我进行 5 年以上的 Java 开发之后,它仍然存在,这让我感到相当震惊。这真是令人沮丧,而且令人难以置信的低效。

就在有人建议增加永久空间之前,相信我,我已经尝试过了,它“解决”的唯一一件事就是延长不可避免的时间。我已经看到重新部署在最坏的情况下最多需要 400 秒。重新部署应该需要这种规模的项目需要 5-6 秒,仅此而已。)

编辑:在执行以下步骤后,我在 Glassfish 进程上运行了 jmap 和 jhat:

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

事实证明,我所有的类(应该已经卸载)仍然加载!希望这对阅读本文的人有用...

4

2 回答 2

3

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

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

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

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

于 2013-02-07T11:55:45.013 回答
0

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

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

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

于 2013-11-03T20:23:04.857 回答