Java中的“PermSize”是什么?

我正在阅读Java内存pipe理中的文档,并且遇到了我无法理解的PermSize。 该文件说,它存储“JVM存储其元数据”,但我不能确切地得到元数据的含义。 我是谷歌search和我读的地方存储一个值对象(用户定义的对象)。

什么样的对象存储在那里? 一个解释的例子会很好。

“永久一代”的快速定义:

“永久代是用来保存虚拟机本身的reflection数据,比如类对象和方法对象,这些reflection对象被直接分配到永久代中,并且其大小与其他代相独立。 [参考文献]

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

请注意, PermSize是JVM选项上用户设置的-Xmx值的附加值。 但MaxPermSize允许JVM能够将PermSize增长到指定的数量。 最初,当VM加载时, MaxPermSize仍然是默认值(32MB用于客户端,64MB用于服务器),但在实际需要之前实际上不会占用该数量。 另一方面,如果PermSizeMaxPermSize都设置为256mb,则会注意到-Xmx设置之外,整个堆增加了256mb。

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

还有一个关于直接从Sun 收集垃圾的常见问题解答 ,它回答了关于永久代的一些问题。 最后,这里有一个博客文章 ,有很多技术细节。

(+)实际上永久生成的部分被GCed,例如,当一个类被卸载时类对象将被移除。 但是当永久代被引入到JVM中时,这种情况并不常见,因此得名。

permament池包含了不是你的应用程序数据的所有东西,而是VM所需要的东西:通常它包含实际的string,定义的类的字节码,还有其他“不是你的”数据段。