PermGen实际上代表什么?


122

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

我不知道PermGen实际上代表什么。永久... Gen ...什么?

有人知道PermGen实际代表什么吗?


1
[Good description] [1]来自对GC内部知识非常了解的人。顺便说一下,在他的博客中有很多有用的与GC相关的信息。[1]:blogs.oracle.com/jonthecollector/entry/…–
伊万·杜布罗夫

Answers:


84

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

简要地说,它包含与类和内联字符串关联的Java对象。在Sun的共享客户端实现中,classes.jsa内存映射为初始数据,其中约一半为只读状态,而一半为写时复制。

古老的Java对象保留在Tenured Generation中。


19
“在JDK 7中,不再在永久生成的Java堆中分配实习字符串”:oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html
almalkawi 2013年

30
在JDK 8中根本没有永久的一代!很高兴看到这个答案多年来不断发展。
Brian Gordon

3
@BrianGordon是正确的。有关此的更多信息:stackoverflow.com/a/22509753/4557537
Fadi

59

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

-XX:MaxPermSize=384m

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

因此,如果收到OutOfMemoryException:PermGen,则需要增大PermGen的大小,否则可能会遇到类加载器问题。


6
您发布此评论时接受了哪个答案?对我来说,当前接受的答案(这个答案是“ Tom Hawtin-大副”)。编辑您的评论可能有意义,这样不会导致人们不信任当前接受的答案?
jbyler


8

与原始问题并不完全相关,但是可能有人会觉得它有用。PermGen确实是内存中Java用来保留其类的区域。因此,如果有很多类,我们很多人都在PermGen中遇到过OOM。

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




3

如果我没记错的话,gen代表世代,就像世代垃圾收集器(对待年轻对象的方式不同于中年和“永久”对象)。局部性原则建议首先清除最近创建的对象。


1

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

为什么命名为“ PermGen”?

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.