125

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

我不知道 PermGen 实际上代表什么。永久的……根……什么?

有谁知道 PermGen 实际上代表什么?

4

8 回答 8

87

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

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

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

于 2008-11-26T11:57:44.223 回答
61

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

-XX:MaxPermSize=384m

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

所以如果你得到一个 OutOfMemoryException: PermGen 你需要要么让 PermGen 更大,否则你可能会遇到类加载器问题。

于 2008-11-26T14:36:25.807 回答
20

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

于 2008-11-25T21:32:46.870 回答
8

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

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

于 2014-06-17T11:51:41.047 回答
6

PermGen 代表永久代

这是关于 DDJ的简短介绍

于 2008-11-25T21:34:35.947 回答
3

永久代

于 2008-11-25T21:33:37.570 回答
3

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

于 2008-11-25T21:34:14.417 回答
1

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

为什么叫“PermGen”?

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

于 2018-08-12T07:40:17.990 回答