什么是永久代空间?

91
在学习Java内存分析时,除了“堆”外,我经常看到“永久空间”这个术语。我知道堆是什么,那么永久空间是什么呢?

13
Java 8彻底删除了这个概念,并转入Metaspace。 - pramodc84
2
参考资料在这里得到了很好的解释 https://www.youtube.com/watch?v=PUUJ4rNpRhU - shareef
10个回答

106

它代表永久代

永久代是特殊的,因为它保存描述用户类(不属于Java语言的类)的元数据。这些元数据的示例是描述类和方法的对象,并且它们存储在永久代中。具有大型代码库的应用程序可以快速填满堆的此部分,这将导致java.lang.OutOfMemoryError:PermGen,无论您的-Xmx如何以及机器上有多少内存。


安德鲁,我只是好奇 PerGen 的大小可能是多少? - thar45
只是好奇PermGen是堆内存的一部分(如此答案中所述),还是它是非堆内存(如此答案中所述-https://dev59.com/W3I95IYBdhLWcg3w1Bvo#31103100)。 - akki

27

Perm space用于存储加载类和其他高级功能(如String Pool,用于高度优化的字符串等式测试)的信息。这些通常是由String.intern()方法创建的。

随着您的应用程序(类数量)增长,这个空间很快就会填满,因为垃圾回收在该空间上的清理效果不够。您很快就会遇到内存不足:perm gen space错误。此后,在具有巨大空闲JVM的机器上也无法有效运行任何应用程序。

在启动应用程序之前,您应该使用java -XX:MaxPermSize来解决这个错误。


自Java 7以来,字符串池被移至堆空间。 - Caffeine Coder

20
简单(但是过于简化)的回答是:它是JVM存储自己簿记数据的地方,与您的数据不同。

17

Perm Gen是永久代的缩写,它保存了有关类的元数据信息。

  1. 假设您创建了一个名为A的类,它的实例变量将存储在堆内存中,并且类A以及静态类加载器将存储在永久代中。
  2. 垃圾收集器将很难清除或释放永久代内存中存储的内存空间。因此,建议将permgen内存设置保持在建议的限制范围内。
  3. JAVA8引入了称为元空间(meta-space)的概念,因此当您使用jdk 1.8版本时,不再需要permgen。

5

Permgen空间是堆中的一个区域,用于存储虚拟机本身的反射数据,例如类和方法对象。


3

它保存了类定义、字符串池等内容。我想你可以称之为元数据。


3

Permgen space通常被称为方法区。当类装载器子系统将类文件(字节码)加载到方法区(permGen)时,它包含所有类元数据,例如:您的类的完全限定名称、直接父类的完全限定名称、变量信息、构造函数信息、常量池信息等。


2

PremGen下存在什么:类区域属于PremGen区域。静态字段也是在类加载时开发的,因此它们也存在于PremGen中。常量池区域包含所有不可变字段,例如String类型的字段。除此之外,由类加载器加载的类数据、对象数组、jvm使用的内部对象也位于此处。


1
  • JVM拥有Java对象的内部表示,并将这些内部表示存储在堆中(年轻代或老年代)。
  • JVM还拥有Java类的内部表示,并将其存储在永久代中。

enter image description here


1
PermGen Space代表永久代的内存分配,所有Java不可变对象都属于这个类别,比如使用文字或String.intern()方法创建的String以及用于将类加载到内存中的对象。PermGen Space加速了我们对字符串相等性的搜索。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接