JVM 方法区是否会出现内存溢出?

Sherwin.Wei Lv8

JVM 方法区是否会出现内存溢出?

回答重点

Java 7 及之前的方法区被实现为永久代(PermGen)中,它是固定大小的内存区域,不能动态扩展。如果加载的类过多或常量池的数据过多,超出了永久代的限制,就会出现 OutOfMemoryError: PermGen space 错误。

在 Java 8 及之后,方法区改用元空间(Metaspace)来代替永久代。元空间不再使用堆内存,而是使用本地内存(Native Memory)元空间大小默认没有限制(仅受物理内存限制),但可以通过参数设置最大大小。如果加载的类数量过多,或者大量动态生成类可能仍会导致元空间内存溢出,报错信息为 OutOfMemoryError: Metaspace

扩展知识

参数调整

Java 7 及之前:可以通过 -XX:PermSize-XX:MaxPermSize 设置永久代的初始和最大大小。

Java 8 及之后,可以通过以下参数来调整元空间大小:

  • -XX:MetaspaceSize:设置元空间初始大小。
  • -XX:MaxMetaspaceSize:设置元空间的最大大小,防止其无限增长

为什么 Java 8 移除了永久代(PermGen)并引入了元空间(Metaspace)

Comments