java中PermGen空间的意义是什么?
4 回答
PermGen 空间是为长期对象保留的——主要是Class
由ClassLoader
. PermGen 不会被垃圾回收,除非在非常特殊的情况下(特别是当ClassLoader
加载这些类超出范围时)。
这是一种垃圾收集优化——如果我们不希望被垃圾收集的对象单独存储,它会压缩存储其余对象的空间,从而减少垃圾收集器的工作。
PermGen 特定于具有分代垃圾收集的 VM。
如果你使用 JRockit,那么“PermGen 的意义”是不存在的,因为 JRockit 没有这个概念。
几年前,当奇怪的“PermGen 空间不足”错误开始出现并且没有人知道是谁的错(Tomcat + Hibernate + Sun VM 用来触发这个)时,它曾经很常见,以替换其中一个组件(现在问题已经被理解了,但是几年前当他们开始种植时,几乎不可能找到任何关于这方面的信息)。您可以用 Resin 替换 Tomcat,或者用 JRockIt 等替换 Sun VM。
我认为重要的是要指出 PermGen 不是 Java 规范的一部分,而只是(相当)某些 VM 的实现细节。
您真正需要知道的唯一一件事是 PermGen 空间与一般堆是分开的,并且不受-Xmx
VM 参数的影响。如果您有一个加载大量类定义的应用程序(如应用程序服务器或 IDE),那么您可以使用-XX:MaxPermSize
VM 选项设置 PermGen 空间大小。
永久代保存描述用户类(不属于 Java 语言的类)的元数据。
具有大型代码库的应用程序可能会填满这部分堆,这将导致java.lang.OutOfMemoryError: PermGen
. 这不受 -Xmx 设置或机器上有多少内存的影响。要设置新的初始大小,请使用-XX:PermSize=64m
. 要设置最大大小,请使用-XX:MaxPermSize=128m