“当前已加载的类”:持续增加,PermGen 在最大值附近波动?

“当前已加载的类”:持续增加,PermGen 在最大值附近波动?

过去几天,我一直在对我的 Web 应用程序进行负载测试,我注意到通过 JMX 监控看到的“当前已加载的类”不断增加。它会先上升然后下降,但加载的类的平均数量会随时间线性增加。在负载开始时,“当前已加载的类”只有几千个。然而现在,“当前已加载的类”已经达到 130,000+。

这是正常的吗?我知道类会填满 PermGen 内存,但无法确定 PermGen 内存是否泄漏。

Used: 
    65,124 kbytes
Committed: 
    65,536 kbytes
Max: 
    65,536 kbytes

已用数量在 62k 和 65k 之间变化,但我尚未发现服务器上出现任何灾难性故障。那么,我的问题有两个方面。

首先,这是正常的吗?如果不是,这最终会导致 Tomcat 崩溃吗?

答案1

恐怕您的问题没有明确的答案。permgen 中的大部分空间应该由应用程序的类占用。您的应用程序有可能在运行时生成类。那么您的应用程序所描述的行为就是预期的。当您的应用程序没有动态生成类时,已加载的类的数量和 permgen 的数量应该或多或少是静态的。

当您的应用程序创建太多类时,您可能会遇到内存问题。然后您将java.lang.OutOfMemoryError: PermGen space在 tomcat 日志中看到消息。您可以通过使用此参数明确设置 perm gen 来测试这一点:-XX:MaxPermSize=

您还可以尝试此参数:-XX:+CMSClassUnloadingEnabled使用 cms 垃圾收集器。当已加载类的数量没有减少时,您仍然有对象对这些类的引用。这可能表明您确实存在内存泄漏。但您必须了解正在运行的应用程序才能确定。当这是应用程序所需的行为时,您只能增加 perm gen 的空间。perm gen 的大小是堆大小的补充。

这里是 stackoverflow 上的一篇帖子,其中提出了一种方法来明确 permgen 的内容。

相关内容