29

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

4

4 回答 4

44

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

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

于 2010-02-10T16:36:50.337 回答
8

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

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

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

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

于 2010-02-10T17:33:53.610 回答
6

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

于 2010-02-10T16:41:15.990 回答
4

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

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

于 2010-02-10T16:45:50.540 回答