2009-08-14 70 views
76

在学习Java内存分析时,除了“堆”之外,我还看到术语“perm space”。我知道堆是什么 - 什么是烫发空间?什么是烫发空间?

+9

Java 8已经完全移除了这个概念并进入了Metaspace – pramodc84 2014-12-19 17:39:07

+0

*参考*在这里解释很好https://www.youtube.com/watch?v=PUUJ4rNpRhU – shareef 2017-11-26 21:23:58

回答

89

它代表permanent generation

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

+0

安德鲁,我只是想知道什么可能是PerGen的大小? – gks 2017-03-02 02:35:00

4

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

1

它拥有的东西一样的类定义,串池,等我想你可以把它称为元数据。

17

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

24

Perm space是用来保持信息加载的类和其他一些高级特性,如String Pool(高度优化的字符串相等测试),通常就会得到由String.intern()方法创建的。 随着你的应用程序(类的数量)的增长,这个空间应该被快速填充,因为这个空间上的垃圾收集没有太多的有效清理,你会很快得到内存不足:perm gen space错误。之后,即使在拥有巨大的空JVM之后,也不会有效地在该机器上运行应用程序。

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

1

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

14

彼尔姆创手段永久代其保持关于类的元数据的信息。

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

在PremGen下面有什么:Class Area属于PremGen地区。静态字段也在类加载时开发,所以它们也存在于PremGen中。常量池区域具有像String一样汇集的所有不可变字段将保留在此处。除此之外,由类加载器,对象数组以及由jvm使用的内部对象加载的类数据也位于此处。

1

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