Java中的“PermSize”是什么?

70

我正在阅读Java内存管理文档,其中遇到了PermSize,但我不理解它的含义。文档称它存储“JVM存储其元数据”,但我并不确定元数据的具体含义。我进行了谷歌搜索,看到有人说它存储一个值对象(用户定义的对象)。

里面存储了哪些类型的对象?可以给出一个示例以及解释吗?


默认值对于64位虚拟机是64m。我们将其增加到512m,用于运行8个Rails应用程序的Tomcat服务器。-XX:MaxPermSize=512m -XX:PermSize=512m。Tomcat本身带有许多类定义,需要一个大的PerSize,并且与Ruby、Ruby on Rails和JRuby结合使用时需要一个巨大的PermSize。 - so_mv
2
请注意,Java 8中的永久代(以及PermSize参数)将被淘汰。它们将被“元空间”所取代。请参阅http://javaeesupportpatterns.blogspot.co.uk/2013/02/java-8-from-permgen-to-metaspace.html。 - sleske
@sleske BitDefender阻止了该页面,称其包含恶意软件。 - Andreas detests censorship
4个回答

115

"永久代"的快速定义:

"永久代用于保存VM本身的反射数据,例如类对象和方法对象。这些反射对象直接分配到永久代中,与其他代独立分配。" [ref]

换句话说,这是类定义所在的位置(这解释了为什么当应用程序加载大量类和/或重新部署时可能会收到消息OutOfMemoryError: PermGen space)。

请注意,PermSize是用户在JVM选项上设置的-Xmx值之外的附加值。但是MaxPermSize允许JVM能够将PermSize增加到指定的大小。最初,当VM加载时,MaxPermSize仍将是默认值(对于-client为32mb,对于-server为64mb),但在需要之前实际上不会占用那么多空间。另一方面,如果您将PermSizeMaxPermSize都设置为256mb,则会注意到堆的总体大小增加了256mb,除了-Xmx设置之外。


24

这篇博客文章提供了一个很好的解释和一些背景知识。基本上,“永久代”(其大小由PermSize决定)用于存储JVM必须分配空间但通常不会被垃圾回收的东西(因此称为“永久”)。这意味着例如加载的类和静态字段。

还有来自Sun的垃圾回收FAQ,它回答了一些关于永久代的问题。最后,这里是一篇包含很多技术细节的博客文章

(+) 其实永久代的某些部分将被垃圾回收,例如当一个类卸载时,类对象将被移除。但是在永久代引入JVM时,这种情况很少见,因此有了这个名称。


11

永久代包含的是与您的应用数据无关的内容,而是VM所需的:通常它包含了已定义类的字节码,以及其他一些“非用户”数据,例如池化的字符串。


0

类定义和元数据的存储空间。如果加载了大型代码库项目,不足的 Perm Gen 大小将导致常见的 Java.Lang.OutOfMemoryError: PermGen。


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