PermGen 空间的意义

Posted

技术标签:

【中文标题】PermGen 空间的意义【英文标题】:Significance of PermGen Space 【发布时间】:2011-01-15 08:41:10 【问题描述】:

java中PermGen空间的意义是什么?

【问题讨论】:

What does PermGen actually stand for? 的可能重复项 【参考方案1】:

PermGen 特定于具有分代垃圾收集的 VM。

如果你使用 JRockit,那么“PermGen 的意义”是不存在的,因为 JRockit 没有这个概念。

它曾经很常见,几年前,当奇怪的“PermGen 空间不足”错误开始出现时,没有人知道是谁的错(Tomcat + Hibernate + Sun VM 曾触发此错误)来替换一个组件(现在问题已被理解,但几年前当他们开始种植时,几乎不可能找到任何关于此的信息)。您可以将 Tomcat 替换为 Resin 或将 Sun VM 替换为 JRockIt 等。

我认为重要的是要指出 PermGen 不是 Java 规范的一部分,而只是(相当)某些 VM 的实现细节。

【讨论】:

【参考方案2】:

永久代保存描述用户类(不属于 Java 语言的类)的元数据。

具有大型代码库的应用程序可能会填满这部分堆,这将导致java.lang.OutOfMemoryError: PermGen。这不受 -Xmx 设置或机器上有多少内存的影响。要设置新的初始大小,请使用 -XX:PermSize=64m。要设置最大大小,请使用-XX:MaxPermSize=128m

【讨论】:

“不属于 Java 语言的类”是什么意思?你知道哪些类不会存储在 PermGen 中吗?【参考方案3】:

您真正需要知道的唯一一件事是 PermGen 空间与一般堆是分开的,并且不受 -Xmx VM 参数的影响。如果您有一个加载大量类定义的应用程序(如应用程序服务器或 IDE),那么您可以使用 -XX:MaxPermSize VM 选项设置 PermGen 空间大小。

【讨论】:

【参考方案4】:

PermGen 空间是为长期对象保留的——主要是由ClassLoader 加载的Class 对象。 PermGen 不会被垃圾回收,除非在非常特殊的情况下(特别是当加载这些类的ClassLoader 超出范围时)。

这是一种垃圾收集优化 - 如果我们不希望被垃圾收集的对象单独存储,它会压缩存储其余对象的空间,从而减少垃圾收集器的工作。

【讨论】:

你说的ClassLoader是System类加载器吗?引导类加载器加载的类存储在哪里? 引导加载程序加载的类是语言不可或缺的类,例如StringObject。这是 JVM 原生实现的一部分,因此对于“在哪里”没有标准答案。 很好。那么 permgen 会包含系统类加载器加载的类吗? 是的,没错。请记住,我们讨论的是 JVM 的 Sun 实现。 PermGen 不是规范的一部分,因此另一个 JVM(例如另一张海报提到的 JRockit)不会拥有它。

以上是关于PermGen 空间的意义的主要内容,如果未能解决你的问题,请参考以下文章

内存不足:Permgen 空间 [重复]

休眠:OutOfMemoryError:PermGen 空间 [重复]

如何清除tomcat中的PermGen空间错误

java.lang.OutOfMemoryError:PermGen 空间 [重复]

java中元空间区域或permgen的引用在哪里

java.lang.OutOfMemoryError: PermGen 空间