Java 什么是';PermSize';在爪哇?

Java 什么是';PermSize';在爪哇?,java,memory,Java,Memory,我在查阅文件时,偶然发现了一些我不明白的地方。文档中说它存储“JVM存储其元数据”,但我无法确切理解元数据的含义。我在谷歌上搜索,在某个地方我读到它存储了一个值对象(用户定义的对象) 那里储存了什么样的物品?一个有解释的例子会很好。permament池包含所有不是您的应用程序数据的内容,而是VM所需的内容:通常它包含内部字符串、定义类的字节码,还有其他“不是您的”数据片段。给出了一个很好的解释和一些背景信息。基本上,“永久生成”(其大小由PermSize给定)用于存储JVM必须为其分配空间的内容

我在查阅文件时,偶然发现了一些我不明白的地方。文档中说它存储“JVM存储其元数据”,但我无法确切理解元数据的含义。我在谷歌上搜索,在某个地方我读到它存储了一个值对象(用户定义的对象)


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

permament池包含所有不是您的应用程序数据的内容,而是VM所需的内容:通常它包含内部字符串、定义类的字节码,还有其他“不是您的”数据片段。

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

还有一个直接来自太阳的例子,它回答了一些关于永久一代的问题。最后,这里是一个包含大量技术细节的示例

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

对“永久性生成”的快速定义:

“永久一代人习惯于 保存VM本身的反射数据 例如类对象和方法 对象。这些反射对象是 直接分配到永久 一代,它的大小 相互独立 几代人。”

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


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

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

对于64位VM,默认值为64m。对于运行8个rails应用程序的tomcat服务器,我们将其增加到了
512m
<代码>-XX:MaxPermSize=512m-XX:PermSize=512m。具有许多类定义的Tomcat本身需要一个大的PerSize,而ruby、ruby-on-rails和jruby的结合需要一个巨大的PermSize。请注意,Java 8中的永久生成(及其PermSize参数)正在消失。它们被“元空间”替换。请参阅@sleske BitDefender阻止该页面,说明该页面包含恶意软件。