java permgen如何与代码大小相关联

我一直在阅读很多有关Java内存pipe理,垃圾收集等,我试图find我的有限的记忆(在一个小的ec2实例1.7克)的最佳设置我想知道是否有直接的相关性我的代码大小和permgen设置。 根据太阳:

永久代是特殊的,因为它保存虚拟机所需的数据,以描述在Java语言级别上不具有等价性的对象。 例如描述类和方法的对象被存储在永久代中。

对我来说,这意味着它真的存储我的类def'ns等…这是否意味着我的编译代码大小和我应该设置的permgen之间的直接关系? 我的整个应用程序是大约40mb,我注意到我们使用256mb permgen。 我想也许我们正在使用内存,可以更好地分配给像对象实例等dynamic代码…

您的Tomcat是否configuration为自动重新部署应用程序文件夹中的应用程序? 你使用这个function吗?

如果使用该function,PermGen空间中使用的内存量可能会增加。 这可能是由于(写得不好)的应用程序在某种程度上保持对被加载类的引用。 每次重新部署时,PermGen空间中使用的内存量都会增加,直到溢出。

如果您不使用该function,并且始终在Tomcat服务器上运行相同的应用程序,那么我只会尝试使用PermGen空间的默认设置来运行Tomcat。 如果应用程序加载,运行良好一段时间,那应该没问题。 如果应用程序用完了PermGen空间,那么只需逐步增加它,直到PermGen空间足够大。

为什么它被configuration为256米(如你的其他问题所见)呢?

顺便说一下,是的,在PermGen区域中,所加载的类的数量和所需的空间量之间存在相关性。 所以,是的,加载的代码越多,你需要的PermGen空间就越多。

Sun说 ,这个permgen是存储在Java语言中没有等价对象的存储:

与老一辈密切相关的第三代是永久的一代。 永久代是特殊的,因为它保存虚拟机所需的数据,以描述在Java语言级别上不具有等价性的对象。 例如描述类和方法的对象被存储在永久代中。

所以是的,永久代包含了描述对象和方法等的“内部”JVM数据结构。 256 MB可能会相当大,但这取决于应用程序。

在我运行的一个大型ColdFusion应用程序中,为运行编译的ColdFusion代码创build了大量的类,并且正在运行一个永久生成设置为192 MB的代码。 我想我也曾经成功地在128 MB下运行它,所以这绝对是你可以尝试的东西。

如果您在调整这些GC参数之前和之后测量负载下的性能,则可以知道您的更改对应用程序性能的影响。

另外,链接的文档给出了很多关于JVM如何pipe理它的内存的信息 – 这是很好的阅读。