我知道这可能已经被问过很多次了,但我仍然没有看到它的实际修复。
我的日常开发环境如下: 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:
- 开始玻璃鱼
- 部署我的 EA
- 取消部署我的 EA
- 然后用jmap做了一个堆转储
事实证明,我所有的类(应该已经卸载)仍然加载!希望这对阅读本文的人有用...