【发布时间】:2010-11-19 17:59:58
【问题描述】:
在学习 java 内存分析时,除了“堆”之外,我不断看到术语“永久空间”。我知道堆是什么——烫发空间是什么?
【问题讨论】:
-
Java 8 已经完全去除了这个概念并移入了元空间
-
参考在这里解释得很好youtube.com/watch?v=PUUJ4rNpRhU
在学习 java 内存分析时,除了“堆”之外,我不断看到术语“永久空间”。我知道堆是什么——烫发空间是什么?
【问题讨论】:
【讨论】:
Permgen 空间总是被称为方法区。当类加载器子系统将类文件(字节码)加载到方法区(permGen)时。 它包含所有类元数据,例如:类的完全限定名、直接父类的完全限定名、变量信息、构造函数信息、常量池信息等。
【讨论】:
PremGen 下存在的内容:类区域属于 PremGen 区域。静态字段也是在类加载时开发的,因此它们也存在于 PremGen 中。具有所有像 String 一样池化的不可变字段的常量池区域保留在这里。除此之外,还定位了类加载器加载的类数据、对象数组、jvm使用的内部对象。
【讨论】:
Perm Gen 代表永久生成,它保存有关类的元数据信息。
【讨论】:
PermGen Space 代表永久生成的内存分配所有 Java 不可变对象都属于此类别,例如 String 它是使用文字或 String.intern() 方法创建的,用于将类加载到内存中。 PermGen Space 加速了我们的字符串相等搜索。
【讨论】:
Perm space 用于保存已加载类的信息和一些其他高级功能,如String Pool(用于高度优化的字符串相等测试),通常由String.intern() 方法创建。
随着您的应用程序(类数量)的增长,这个空间将很快被填满,因为这个空间上的垃圾收集并不能按要求进行清理,所以您很快就会出现内存不足:perm gen space 错误。之后,即使有一个巨大的空 JVM,应用程序也不会在该机器上有效运行。
在启动您的应用程序之前,您应该java -XX:MaxPermSize 以消除此错误。
【讨论】:
简单(而且过于简单)的答案:它是 jvm 存储自己的簿记数据的地方,而不是您的数据。
【讨论】:
它包含类定义、字符串池等内容。我猜你可以称之为元数据。
【讨论】:
permgen 空间是堆的区域,用于保存虚拟机本身的所有反射数据,例如类和方法对象。
【讨论】:
永久代是特殊的 因为它包含描述的元数据 用户类(不是 Java 语言的一部分)。例子 这些元数据是对象 描述类和方法以及 它们存储在永久 一代。大型应用 代码库可以快速填满这个 将导致的堆段
java.lang.OutOfMemoryError: PermGen 没有 不管你的 -Xmx 有多高和多少 机器上的内存。
【讨论】: