我知道 PermGen 是什么,它的用途,它为什么失败,如何增加它等等。
我不知道 PermGen 实际上代表什么。永久的……根……什么?
有谁知道 PermGen 实际上代表什么?
永久一代。细节当然是特定于实现的。
简而言之,它包含与类和内部字符串关联的 Java 对象。在 Sun 的启用共享的客户端实现中,classes.jsa
内存映射以形成初始数据,大约一半是只读的,一半是写时复制的。
只是旧的 Java 对象保存在 Tenured Generation 中。
JVM 使用 PermGen 来保存已加载的类。您可以使用以下方法增加它:
-XX:MaxPermSize=384m
如果您使用的是 Sun JVM 或 OpenJDK。
所以如果你得到一个 OutOfMemoryException: PermGen 你需要要么让 PermGen 更大,否则你可能会遇到类加载器问题。
永久一代。有关垃圾收集器的更多详细信息,请参阅 java GC 调整指南。
与原始问题没有真正相关的匹配,但可能有人会发现它有用。PermGen 确实是 Java 用来保存其类的内存区域。因此,我们中的许多人都在 PermGen 中遇到过 OOM,例如,如果有很多类的话。
从 Java 8 开始,PermGen 区域已被 MetaSpace 区域取代,后者效率更高且默认不受限制(或更准确地说 - 受本机内存量限制,取决于 32 位或 64 位 jvm 和 OS 虚拟内存可用性)。但是,可以通过某些方式对其进行调整,例如指定区域的最大限制。您可以在此博客文章中找到更多有用的信息。
PermGen 代表永久代。
这是关于 DDJ的简短介绍
如果我没记错的话,gen 代表世代,就像在世代垃圾收集器中一样(它对年轻对象的处理不同于中年和“永久”对象)。局部性原则表明最近创建的对象将首先被清除。
Permgen 代表永久一代。它是 JVM 内存区域之一。通过使用名为 MaxPermSize 的标志,它是具有固定大小的堆的一部分。
为什么叫“PermGen”?
这个 permgen 在 Java 的早期就被命名了。Permgen mains 保留已加载类的所有元数据。但问题是,一旦加载了一个类,它就会一直保留在 JVM 中,直到 JVM 关闭。所以名字 permgen 是选择的。但后来,类的动态加载出现了,但名称没有改变。但是在Java 8中,他们也解决了这个问题。现在permagen被重命名为具有动态内存大小的MetaSpace 。