java permgen 与代码大小有何关系

java permgen 与代码大小有何关系

我已经阅读了大量有关 Java 内存管理、垃圾收集等内容的资料,并试图为我有限的内存(小型 EC2 实例上为 1.7g)找到最佳设置。我想知道我的代码大小和 permgen 设置之间是否存在直接关联。根据 sun 的说法:

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

对我来说,这意味着它实际上存储了我的类定义等...这是否意味着我的编译代码大小与我应该设置的 permgen 之间存在直接关联?我的整个应用程序大约 40mb,我注意到我们使用了 256mb permgen。我在想也许我们使用的内存可以更好地分配给动态代码,如对象实例等...

答案1

您的 Tomcat 是否配置为自动重新部署放在应用程序文件夹中的应用程序?您是否使用此功能?

如果您使用该功能,PermGen 空间中使用的内存量可能会增加。这可能是由于(编写不当的)应用程序以某种方式保持对已加载类的引用处于活动状态而发生的。每次重新部署时,PermGen 空间中使用的内存量都会增加,直到溢出。

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

为什么首先将其配置为 256m(如您在其他问题中所见)?

顺便说一句,是的,已加载类和 PermGen 区域中所需的空间量。因此,加载的代码越多,所需的 PermGen 空间就越大。

答案2

太阳说permgen 是用于存储 Java 语言中没有等价对象的:

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

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

在我运行的大型 ColdFusion 应用中,会为即时编译的 ColdFusion 代码创建大量类,并且我运行时将永久生成设置为 192 MB。我想我以前在 128 MB 下也能成功运行它,所以这绝对是你可以尝试的东西。

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

此外,我链接的文档提供了大量有关 JVM 如何管理其内存的信息 - 非常值得一读。

相关内容