在学习Java内存分析时,除了“堆”外,我经常看到“永久空间”这个术语。我知道堆是什么,那么永久空间是什么呢?
它代表永久代:
永久代是特殊的,因为它保存描述用户类(不属于Java语言的类)的元数据。这些元数据的示例是描述类和方法的对象,并且它们存储在永久代中。具有大型代码库的应用程序可以快速填满堆的此部分,这将导致
java.lang.OutOfMemoryError
:PermGen,无论您的-Xmx如何以及机器上有多少内存。
Perm space
用于存储加载类和其他高级功能(如String Pool
,用于高度优化的字符串等式测试)的信息。这些通常是由String.intern()
方法创建的。
随着您的应用程序(类数量)增长,这个空间很快就会填满,因为垃圾回收在该空间上的清理效果不够。您很快就会遇到内存不足:perm gen space错误。此后,在具有巨大空闲JVM的机器上也无法有效运行任何应用程序。
在启动应用程序之前,您应该使用java -XX:MaxPermSize
来解决这个错误。
Perm Gen是永久代的缩写,它保存了有关类的元数据信息。
Permgen空间是堆中的一个区域,用于存储虚拟机本身的反射数据,例如类和方法对象。
它保存了类定义、字符串池等内容。我想你可以称之为元数据。
Permgen space通常被称为方法区。当类装载器子系统将类文件(字节码)加载到方法区(permGen)时,它包含所有类元数据,例如:您的类的完全限定名称、直接父类的完全限定名称、变量信息、构造函数信息、常量池信息等。
PremGen下存在什么:类区域属于PremGen区域。静态字段也是在类加载时开发的,因此它们也存在于PremGen中。常量池区域包含所有不可变字段,例如String类型的字段。除此之外,由类加载器加载的类数据、对象数组、jvm使用的内部对象也位于此处。
String.intern()
方法创建的String
以及用于将类加载到内存中的对象。PermGen Space加速了我们对字符串相等性的搜索。