Java中的“PermSize”是什么?

2022-08-31 14:17:55

我正在浏览Java内存管理中的文档,其中我遇到了我无法理解的PermSize。文档说它存储“JVM存储其元数据”,但我无法确切地了解元数据的含义。我正在谷歌搜索,在某个地方我读到它存储了一个值对象(用户定义的对象)。

那里存储了哪些类型的对象?一个有解释的例子会很棒。


答案 1

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

“永久生成用于保存 VM 本身的反射数据,例如类对象和方法对象。这些反射物体直接分配到永久一代中,并且其大小独立于其他几代。[参考]

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

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


答案 2

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

还有一个关于直接从Sun收集垃圾的常见问题解答,它回答了有关永久生成的一些问题。最后,这是一篇博客文章,其中包含许多技术细节。

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