什么是烫发空间?

时间:2009-08-14 18:35:08

标签: java profiling

在了解java内存分析的同时,除了“堆”之外,我还不断看到“perm space”这个术语。我知道堆是什么 - 什么是烫发空间?

10 个答案:

答案 0 :(得分:99)

代表permanent generation

  

永久世代很特别   因为它包含元数据描述   用户类(不是的类)   Java语言的一部分)。例子   这些元数据是对象   描述类和方法   它们存储在Permanent中   代。应用程序大   代码库可以快速填满这个   将导致的堆段   java.lang.OutOfMemoryError:PermGen没有   你的-Xmx和多少有多高   你在机器上的记忆。

答案 1 :(得分:25)

Perm space用于保存已加载类的信息以及其他一些高级功能,例如String Pool(用于高度优化的字符串相等性测试),通常由String.intern()方法创建。 随着您的应用程序(类的数量)将增长,此空间将快速填充,因为此空间上的垃圾收集对于根据需要清理不太有效,您很快就会失去内存:perm gen space错误。之后,即使拥有一个巨大的空JVM,也不会有效地在该机器上运行应用程序。

在开始申请之前,你应该java -XX:MaxPermSize摆脱这个错误。

答案 2 :(得分:19)

简单(和过度简化)答案:jvm存储自己的簿记数据,而不是数据。

答案 3 :(得分:17)

Perm Gen代表永久生成,它保存有关类的元数据信息。

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

答案 4 :(得分:4)

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

答案 5 :(得分:3)

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

答案 6 :(得分:2)

它包含类定义,字符串池等内容。我猜你可以称之为元数据。

答案 7 :(得分:2)

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

答案 8 :(得分:1)

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

答案 9 :(得分:1)

  • JVM具有Java对象的内部表示形式以及那些内部表示形式 存储在堆中(在年轻一代或终身一代中)。
  • JVM还具有Java类和那些Java类的内部表示。 存储在永久代中

enter image description here