什么是Java中的'PermSize'?

时间:2009-10-27 23:12:10

标签: java memory

我正在浏览Java Memory Management中的文件,因为我遇到了PermSize,我无法理解。该文档称其存储“JVM存储其元数据”,但我无法准确了解元数据的含义。我在google搜索并在某处读取它存储了一个值对象(用户定义的对象)。

那里储存了什么样的物品?一个解释的例子会很棒。

4 个答案:

答案 0 :(得分:106)

“永久代”的快速定义:

  

“永久世代习惯了   保存VM本身的反射数据   比如类对象和方法   对象。这些反光物体是   直接分配到永久物   一代,它的大小   独立于另一个   几代人。“[ref]

换句话说,这就是类定义的地方(这解释了如果应用程序加载了大量类和/或重新部署,你可能会得到消息OutOfMemoryError: PermGen space

请注意, PermSize 是用户在JVM选项上设置的 -Xmx 值的补充。但 MaxPermSize 允许JVM能够将 PermSize 增加到指定的数量。最初加载虚拟机时, MaxPermSize 仍然是默认值(-client为32mb,-server为64mb)但实际上不会占用金额,直到需要。另一方面,如果您将 PermSize MaxPermSize 设置为256mb,您会发现整体堆已增加256mb除了 -Xmx 设置之外。

答案 1 :(得分:23)

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

还有一个来自Sun的FAQ on garbage collection,它回答了有关永久世代的一些问题。最后,这里有一个blog post,其中包含很多技术细节。

(+)实际上永久代的部分将进行GC,例如卸载类时将删除类对象。但是当永久代被引入JVM时,这种情况并不常见,因而得名。

答案 2 :(得分:9)

永久池包含的不是应用程序数据的所有内容,而是包含VM所需的内容:通常它包含内部字符串,已定义类的字节代码,以及其他“不属于您”的数据。

答案 3 :(得分:0)

花边用于存储您加载的类定义和元数据。如果加载了大型代码库项目,则Perm Gen大小不足将导致流行的Java.Lang.OutOfMemoryError:PermGen。