gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:12:22 28 4
gpt4 key购买 nike

我知道这之前可能已经被问过很多次了,但我仍然没有看到实际的解决方法。

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

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

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

  • Glassfish 用完了 PermGen 空间,所以我只需要终止这个进程。
  • 部署变得非常缓慢,因为我增加了最大 permgen 空间(建议从 S.O. 的数十个答案中这样做)

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

    这是开发环境中的一个长期存在的错误,我感到震惊的是,在我 5 年多的 Java 开发之后,它仍然在发生。这真是令人沮丧,而且效率低下。

    ( 就在有人建议增加永久生成空间 之前,相信我,我已经尝试过了,它“解决”的唯一方法就是延长不可避免的时间。我已经看到重新部署在最糟糕的情况下需要 400 秒. 对于这种规模的项目,重新部署应该需要 5-6 秒,不能更多。)

    编辑 :我按照以下步骤在 Glassfish 进程上运行 jmap 和 jhat:
  • 启动 glassfish
  • 部署我的 EA
  • 取消部署我的 EA
  • 然后用 jmap
  • 做了一个堆转储

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

    最佳答案

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

    您可以尝试:使用一些 热代码替换工具例如 JRebel , 这样你就不用一直部署了,这个工具会观察.class的变化文件(甚至其他 Web 资源,如果您进行了配置),并替换正在运行的 JVM 中的类定义。听起来很酷,对吧?

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

    这个方案有 3 个缺点: 部署有点慢,调试起来比较困难,而且它是一个专有软件(但成本不高)

    关于java - 重新部署时 NetBeans/Glassfish 和 PermGen 空间错误(是的,仍在发生),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14750368/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com