我正在浏览Java Memory Management中的文件,因为我遇到了PermSize,我无法理解。该文档称其存储“JVM存储其元数据”,但我无法准确了解元数据的含义。我在google搜索并在某处读取它存储了一个值对象(用户定义的对象)。
那里储存了什么样的物品?一个解释的例子会很棒。
答案 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。