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类加载器吗?引导类加载器加载的类存储在哪里? 引导加载程序加载的类是语言不可或缺的类,例如String
和Object
。这是 JVM 原生实现的一部分,因此对于“在哪里”没有标准答案。
很好。那么 permgen 会包含系统类加载器加载的类吗?
是的,没错。请记住,我们讨论的是 JVM 的 Sun 实现。 PermGen 不是规范的一部分,因此另一个 JVM(例如另一张海报提到的 JRockit)不会拥有它。以上是关于PermGen 空间的意义的主要内容,如果未能解决你的问题,请参考以下文章
休眠:OutOfMemoryError:PermGen 空间 [重复]