什么是Java中的'PermSize'?

Ana*_*and 65 java memory

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

那里存放了什么样的物体?一个解释的例子会很棒.

Pas*_*ent 107

"永久代"的快速定义:

"永久代用于保存VM本身的反射数据,例如类对象和方法对象.这些反射对象直接分配给永久代,并且其大小独立于其他代." [参考文献]

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

请注意,这PermSize-Xmx用户在JVM选项上设置的值的附加值.但是MaxPermSize允许JVM能够增长PermSize到指定的数量.最初加载VM时,MaxPermSize仍然是默认值(32mb for -client和64mb for -server),但在需要之前实际上不会占用该数量.在另一方面,如果你要同时设置PermSizeMaxPermSize为256MB,你会发现,整体堆增加了256MB额外的-Xmx设置.


sle*_*ske 23

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

还有一个关于垃圾收集常见问题解答,直接来自Sun,它回答了有关永久性一代的一些问题.最后,这是一篇包含大量技术细节的博客文章.

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


ank*_*kon 9

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