在过去的几天里,我对我的 Web 应用程序运行了负载,我注意到通过 JMX 监控查看的“当前加载的类”不断增加。它会上升然后下降,但加载的类的平均数量随时间线性增加。在加载之初,“当前加载的类”只有几千个。然而,现在,“当前加载的类”已达到 130,000+。
这是正常的吗?我知道类会填满 PermGen 内存,但 PermGen 内存是否泄漏尚不确定。
Used:
65,124 kbytes
Committed:
65,536 kbytes
Max:
65,536 kbytes
使用的数字在 62k 和 65k 之间移动,但我还没有注意到服务器上出现任何灾难性故障。那么,我的问题是双重的。
首先,这正常吗?如果不是,这最终会导致 Tomcat 崩溃吗?
恐怕你的问题没有明确的答案。permgen 中的大部分空间应该由应用程序的类占用。您的应用程序可能正在运行时生成类。那么您的应用程序的描述行为符合预期。当您的应用程序没有动态生成类时,加载的类的数量和 permgen 的数量应该或多或少是静态的。
当您的应用程序创建很多类时,您可能会遇到内存问题。然后,您将
java.lang.OutOfMemoryError: PermGen space
在 tomcat 日志中看到消息。您可以通过使用此参数显式设置 perm gen 来测试它-XX:MaxPermSize=
:你也可以试试这个参数:
-XX:+CMSClassUnloadingEnabled
用 cms 垃圾收集器。当加载的类的数量没有减少时,您仍然有从对象到这些类的引用。这可能表明您确实存在内存泄漏。但是您肯定必须知道正在运行的应用程序才能确定。当这是应用程序的期望行为时,您只能增加 perm gen 的空间。perm gen 的大小是堆大小的附加值。这是关于 stackoverflow 的帖子,它提出了一种方法来明确 permgen 的内容是什么。