PermGen空间的意义

29

PermGen空间在Java中的意义是什么?


可能是What does PermGen actually stand for?的重复问题。 - rds
4个回答

44

PermGen空间保留长期对象,主要是由ClassLoader加载的Class对象。除非在特殊情况下(即加载这些类的ClassLoader超出作用域时),否则PermGen不会被垃圾回收。

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


你所指的ClassLoader是系统类加载器吗?引导类加载器加载的类存储在哪里? - java_geek
由引导加载器加载的类是语言中不可或缺的类,例如StringObject。这是JVM本地实现的一部分,因此关于“在哪里”的标准答案并不存在。 - danben
好的。那么permgen会包含系统类加载器加载的类吗? - java_geek
是的,没错。请记住我们正在谈论JVM的Sun实现。PermGen不是规范的一部分,因此另一个JVM(例如另一位发帖者提到的JRockit)将不会有它。 - danben

8
PermGen是特定于具有分代垃圾回收的虚拟机的。如果使用JRockit等VM,则PermGen的重要性不存在,因为JRockit没有这个概念。几年前,当奇怪的“PermGen空间不足”错误开始出现时(Tomcat + Hibernate + Sun VM曾触发此错误),情况很常见,而且还不知道是谁的错,可以更换其中一个组件(现在已经理解了这些问题,但在几年前它们开始出现时,几乎不可能找到任何信息)。您可以用Resin替换Tomcat或用JRockIt替换Sun VM等。我认为强调PermGen不是Java规范的一部分,而只是(相当)一些VM的实现细节很重要。

6

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


4
永久代保存着描述用户类(不属于Java语言的类)的元数据。当代码库较大的应用程序填满了这个堆段时,会导致java.lang.OutOfMemoryError: PermGen错误。这与-Xmx设置或机器上可用的内存大小无关。要设置新的初始大小,请使用-XX:PermSize=64m。要设置最大大小,请使用-XX:MaxPermSize=128m

“Java语言之外的类”是什么意思?你知道有哪些类不会存储在PermGen中吗? - danben

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接