什么是烫发空间?

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

它代表永久的一代 :

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

Perm space用于保存已加载类的信息以及其他一些高级function,如String Pool (用于高度优化的string相等性testing),通常由String.intern()方法创build。 随着你的应用程序(类的数量)的增长,这个空间应该被快速填充,因为这个空间上的垃圾收集没有太多有效的清理要求,你很快就会失去内存:perm gen space错误。 之后,即使在拥有巨大的空JVM之后,也不会有效地在该机器上运行应用程序。

在开始你的应用程序之前,你应该使用java -XX:MaxPermSize来摆脱这个错误。

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

彼尔姆代表永久的一代,持有类的元数据信息。

  1. 假设如果你创build一个类名A,它的实例variables将被存储在堆内存中,而类A和静态类加载器将被永久生成。
  2. 垃圾收集器将难以清除或释放存储在永久代存储器中的存储空间。 因此,总是build议将permgen内存设置保持在最佳限制。
  3. JAVA8引入了元空间生成的概念,因此当您使用jdk 1.8版本时,不再需要permgen。

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

它拥有像类定义,string池等东西。我想你可以称之为元数据。

PermGen空间代表永久生成的内存分配所有Java不可变对象都属于此类别,如使用文字或String.intern()方法创build的String ,以及将类加载到内存中。 PermGen空间加快了我们的string相等search。

在PremGen:Class Area下面存在的是PremGen区域。 静态字段也是在类加载时开发的,所以它们也存在于PremGen中。 常量池区域包含所有不可变的字段,像string一样被保存在这里。 除此之外,还通过类加载器,对象数组以及jvm使用的内部对象加载类数据。

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