【问题标题】:What is 'PermSize' in Java?Java 中的“PermSize”是什么?
【发布时间】:2010-12-10 16:35:09
【问题描述】:

我正在浏览Java Memory Management 中的文档,其中我遇到了我无法理解的 PermSize。该文档说它存储“JVM 存储它的元数据”,但我无法完全理解元数据的含义。我在谷歌上搜索,在某处我读到它存储了一个值对象(用户定义的对象)。

那里存储了哪些类型的对象?一个带有解释的例子会很棒。

【问题讨论】:

  • 对于 64 位 VM,默认值为 64m。对于运行 8 个 rails 应用程序的 tomcat 服务器,我们将其增加到 512m-XX:MaxPermSize=512m -XX:PermSize=512m。具有许多类定义的 Tomcat 本身需要一个大的 PerSize,并且使用 ruby​​、ruby on rails 和 jruby ..需要一个巨大的 PermSize。
  • 请注意,Permanent Generation(以及 PermSize 参数)在 Java 8 中将消失。它们被“元空间”取代。见javaeesupportpatterns.blogspot.co.uk/2013/02/…
  • @sleske BitDefender 阻止该页面,称其包含恶意软件。

标签: java memory


【解决方案1】:

“永久一代”的快速定义:

"永久代用于 保存 VM 本身的反射数据 比如类对象和方法 对象。这些反射物体是 直接分配到永久 一代,它的大小 独立于对方 几代人。”[ref]

换句话说,这就是类定义所在(这解释了为什么如果应用程序加载大量类和/或重新部署时您可能会收到消息OutOfMemoryError: PermGen space)。

请注意,PermSize 是用户在 JVM 选项中设置的 -Xmx 值的附加值。但是 MaxPermSize 允许 JVM 能够将 PermSize 增长到指定的数量。最初加载 VM 时,MaxPermSize 仍将是默认值(-client 为 32mb,-server 为 64mb),但在需要之前不会实际占用该数量。另一方面,如果您将 PermSizeMaxPermSize 都设置为 256mb,您会注意到整体堆比 PermSize 增加了 256mb strong>-Xmx 设置。

【讨论】:

    【解决方案2】:

    This blog post 给出了很好的解释和一些背景知识。基本上,“永久代”(其大小由 PermSize 给出)用于存储 JVM 必须为其分配空间的东西,但这些东西(通常)不会被垃圾收集(因此是“永久”)(+)。这意味着例如加载的类和静态字段。

    还有一个FAQ on garbage collection直接来自Sun,它回答了一些关于永久代的问题。最后,这里有一个blog post,里面有很多技术细节。

    (+) 实际上永久代的部分被GCed,例如卸载类时将删除类对象。但是当永久代被引入 JVM 时,这种情况并不常见,因此得名。

    【讨论】:

      【解决方案3】:

      永久池包含不属于您的应用程序数据的所有内容,而是 VM 所需的内容:通常它包含内部字符串、已定义类的字节码,以及其他“不属于您的”数据。

      【讨论】:

        【解决方案4】:

        lace 来存储您加载的类定义和元数据。如果加载大型代码库项目,Perm Gen 大小不足会导致流行的 Java.Lang.OutOfMemoryError: PermGen。

        【讨论】:

          猜你喜欢
          • 2011-11-19
          • 2016-07-18
          • 1970-01-01
          • 2011-02-12
          • 2011-07-19
          • 2016-09-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多