我正在阅读Java内存管理文档,其中遇到了PermSize,但我不理解它的含义。文档称它存储“JVM存储其元数据”,但我并不确定元数据的具体含义。我进行了谷歌搜索,看到有人说它存储一个值对象(用户定义的对象)。
里面存储了哪些类型的对象?可以给出一个示例以及解释吗?
"永久代"的快速定义:
"永久代用于保存VM本身的反射数据,例如类对象和方法对象。这些反射对象直接分配到永久代中,与其他代独立分配。" [ref]
换句话说,这是类定义所在的位置(这解释了为什么当应用程序加载大量类和/或重新部署时可能会收到消息OutOfMemoryError: PermGen space
)。
请注意,PermSize
是用户在JVM选项上设置的-Xmx
值之外的附加值。但是MaxPermSize
允许JVM能够将PermSize
增加到指定的大小。最初,当VM加载时,MaxPermSize
仍将是默认值(对于-client
为32mb,对于-server
为64mb),但在需要之前实际上不会占用那么多空间。另一方面,如果您将PermSize
和MaxPermSize
都设置为256mb,则会注意到堆的总体大小增加了256mb,除了-Xmx
设置之外。
永久代包含的是与您的应用数据无关的内容,而是VM所需的:通常它包含了已定义类的字节码,以及其他一些“非用户”数据,例如池化的字符串。
类定义和元数据的存储空间。如果加载了大型代码库项目,不足的 Perm Gen 大小将导致常见的 Java.Lang.OutOfMemoryError: PermGen。
512m
,用于运行8个Rails应用程序的Tomcat服务器。-XX:MaxPermSize=512m -XX:PermSize=512m
。Tomcat本身带有许多类定义,需要一个大的PerSize,并且与Ruby、Ruby on Rails和JRuby结合使用时需要一个巨大的PermSize。 - so_mv