【问题标题】:What does PermGen actually stand for?PermGen 实际上代表什么?
【发布时间】:2010-09-24 01:16:52
【问题描述】:

我知道 PermGen 是什么,它的用途,它为什么失败,如何增加它等等。

我不知道 PermGen 究竟代表什么。永久... Gen...什么东西?

有人知道 PermGen 的真正含义吗?

【问题讨论】:

标签: java permgen


【解决方案1】:

Permgen 代表永久代。它是 JVM 内存区域之一。通过使用一个名为 MaxPermSize 的标志,它是具有固定大小的堆的一部分。

为什么叫“PermGen”?

这个 permgen 是在 Java 的早期命名的。 Permgen mains 保留已加载类的所有元数据。但问题是,一旦加载了一个类,它就会一直保留在 JVM 中,直到 JVM 关闭。所以名字 permgen 是选择的。但后来,类的动态加载出现了,但名称没有改变。但是在 Java 8 中,他们也解决了这个问题。现在 permagen 已重命名为具有动态内存大小的 MetaSpace

【讨论】:

    【解决方案2】:

    JVM 使用 PermGen 来保存加载的类。您可以使用以下方法增加它:

    -XX:MaxPermSize=384m

    如果您使用的是 Sun JVM 或 OpenJDK。

    因此,如果您遇到 OutOfMemoryException: PermGen,您需要将 PermGen 变大,否则您可能会遇到类加载器问题。

    【讨论】:

    • 在您发布此评论时,哪个答案被接受?当前接受的答案(this one,由“Tom Hawtin - tackline”)对我来说看起来很准确。编辑您的评论可能有意义,以免导致人们不信任当前接受的答案?
    【解决方案3】:

    与原始问题没有真正相关的匹配,但可能有人会觉得它有用。 PermGen 确实是 Java 用来保存其类的内存区域。因此,我们中的许多人都在 PermGen 中遇到过 OOM,例如,如果有很多类的话。

    从 Java 8 开始,PermGen 区域已被 MetaSpace 区域取代,后者效率更高且默认无限制(或更准确地说 - 受本机内存量限制,取决于 32 位或 64 位 jvm 和操作系统虚拟内存可用性) .但是,可以通过某些方式对其进行调整,例如指定区域的最大限制。你可以在this blog post找到更多有用的信息。

    【讨论】:

      【解决方案4】:

      永久一代。有关垃圾收集器的更多详细信息,请参阅 java GC tuning guide

      【讨论】:

        【解决方案5】:

        永久一代。细节当然是特定于实现的。

        简而言之,它包含与类和内部字符串关联的 Java 对象。在 Sun 的启用共享的客户端实现中,classes.jsa 是内存映射以形成初始数据,大约一半是只读的,一半是写时复制的。

        只是旧的 Java 对象保留在 Tenured Generation 中。

        【讨论】:

        【解决方案6】:

        PermGen 代表永久世代

        Here is a brief blurb 上 DDJ

        【讨论】:

          【解决方案7】:

          如果我没记错的话,gen 代表世代,就像在世代垃圾收集器中一样(它对年轻对象的处理不同于中年对象和“永久”对象)。局部性原则表明最近创建的对象将首先被清除。

          【讨论】:

            【解决方案8】:

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-07-05
              • 2015-09-19
              • 2018-09-18
              • 2010-11-24
              • 1970-01-01
              • 1970-01-01
              • 2013-12-02
              • 2014-10-23
              相关资源
              最近更新 更多