PermGen空间的意义

时间:2010-02-10 16:34:53

标签: java memory-management jvm permgen

PermGen空间在java中有什么意义?

4 个答案:

答案 0 :(得分:44)

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

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

答案 1 :(得分:8)

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

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

几年前,当奇怪的“出于PermGen空间”错误开始出现并且没有人知道它的错误(Tomcat + Hibernate + Sun VM用于触发这个)来替换一个错误时,这是​​常见的。该组件(现在问题已被理解,但几年前,当他们开始裁剪时,很难找到任何有关此问题的信息)。您可以使用Resin或使用JRockIt等的Sun VM替换Tomcat。

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

答案 2 :(得分:6)

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

答案 3 :(得分:4)

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

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