什么是烫发空间?


Answers:


103

它代表着永久的一代

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


安德鲁,我只是想知道PerGen的大小是多少?
gks

只是好奇permgen是堆内存的一部分(如此答案中所述)还是堆外(如此答案中所述-stackoverflow.com/a/31103100/3061686)。
akki

25

Perm space用于保留有关已加载类的信息以及其他一些高级功能String Pool(例如用于高度优化的字符串相等性测试)的信息,这些功能通常由String.intern()方法创建。随着您的应用程序(类数)的增长,该空间将被快速填充,因为此空间上的垃圾回收并不能有效地按要求进行清理,因此您很快会出现Out of Memory:perm gen space error。之后,即使拥有巨大的空JVM,也没有任何应用程序可以在该计算机上有效运行。

在启动应用程序之前,您应该java -XX:MaxPermSize摆脱此错误。


字符串池被由于Java 7转移到堆空间
咖啡因编码器

20

简单(且过于简化)的答案:这是jvm存储自己的簿记数据(而不是您的数据)的地方。


17

Perm Gen代表永久生成,其中包含有关类的元数据信息。

  1. 假设如果创建一个类名A,则它的实例变量将存储在堆内存中,并且类A与静态类加载器一起存储在永久代中。
  2. 垃圾收集器会发现很难清除或释放永久代内存中存储的内存空间。因此,始终建议将permgen内存设置保持在建议的限制内。
  3. JAVA8引入了称为元空间生成的概念,因此当您使用jdk 1.8版本时不再需要permgen。

5

permgen空间是堆的区域,用于存放虚拟机本身的所有反射数据,例如类和方法对象。


3

它包含诸如类定义,字符串池等之类的东西。我猜您可以称其为元数据。


3

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


2

PremGen下存在的内容:Class Area属于PremGen区域。静态字段也在类加载时开发,因此它们也存在于PremGen中。具有像String一样池化的所有不可变字段的Constant Pool区域保留在此处。除此之外,还可以找到由类加载器加载的类数据,对象数组,jvm使用的内部对象。


1

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


1
  • JVM具有Java对象的内部表示形式,并且这些内部表示形式存储在堆中(在年轻代或终身代中)。
  • JVM还具有Java类的内部表示,这些类存储在永久代中

在此处输入图片说明

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.