PermGen 实际上代表啥?
Posted
技术标签:
【中文标题】PermGen 实际上代表啥?【英文标题】:What does PermGen actually stand for?PermGen 实际上代表什么? 【发布时间】:2010-09-24 01:16:52 【问题描述】:我知道 PermGen 是什么,它的用途,它为什么失败,如何增加它等等。
我不知道 PermGen 究竟代表什么。永久... Gen...什么东西?
有人知道 PermGen 的真正含义吗?
【问题讨论】:
[很好的描述][1] 来自对 GC 内部非常了解的人。顺便说一下,在他的博客中有很多有用的 GC 相关信息。 [1]:blogs.oracle.com/jonthecollector/entry/… 【参考方案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 中。
【讨论】:
“在 JDK 7 中,interned 字符串不再分配在 Java 堆的永久代中”:oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html 而且在 JDK 8 中根本没有永久代!很高兴看到这个答案多年来不断发展。 @BrianGordon 是正确的。有关更多信息:***.com/a/22509753/4557537【参考方案6】:PermGen 代表永久世代。
Here is a brief blurb 上 DDJ
【讨论】:
【参考方案7】:如果我没记错的话,gen 代表世代,就像在世代垃圾收集器中一样(它对年轻对象的处理不同于中年对象和“永久”对象)。局部性原则表明最近创建的对象将首先被清除。
【讨论】:
【参考方案8】:Permanent generation
【讨论】:
以上是关于PermGen 实际上代表啥?的主要内容,如果未能解决你的问题,请参考以下文章
Tomcat7解决java.lang.OutOfMemoryError: PermGen space