2

我经常在我的 java(web) 应用程序中看到 High Perm Gen。

jmap 命令,经常显示它被使用了 90%。但这似乎不会对我的应用程序造成任何问题。我的整体堆使用率非常低(大约 400 MB,其中最大内存设置为 2048 MB)。

管理生产中的应用程序的团队担心 PermGen 很高。而且往往各种问题都归咎于它。

问题:
(1)我需要担心只是因为 PermGen 很高,当垃圾收集发生时 PermGen 不会下降吗?
(2) 我是否应该将最大 PermGen 大小加倍(当前为 200 MB),会有副作用吗?

4

2 回答 2

1

您需要担心三件事:堆、永久代和总驻留内存。

在用完之前,您无需担心 perm gen。尝试增加值。

副作用是消耗更多的 RAM。您的统计数据表明您可以使用更多的 perm gen 和更小的最大堆。

您真正关心的不应该是时间点值。由于这是一个 Web 应用程序,因此您需要观察堆、永久生成和总驻留内存,并了解它们如何随着时间的推移而演变。

如果 GC 可以控制一切并且服务器可以处理典型负载和峰值负载,那么您就有了一个不错的应用程序。如果它随着时间的推移而增长,您可能需要担心内存泄漏。

您部署在哪个应用服务器上?这很重要。与成熟的 Java EE 应用服务器相比,Tomcat 应用程序的总驻留内存要轻得多。

于 2013-03-20T12:07:53.617 回答
1

(1)我需要担心只是因为 PermGen 很高,当垃圾收集发生时 PermGen 不会下降吗?

没有。PermGen 是为加载类信息保留的空间。除非说 Web 容器取消部署 WAR 文件并且不再需要这些类,否则它不能被垃圾收集。

(2) 我是否应该将最大 PermGen 大小加倍(当前为 200 MB),会有副作用吗?

第一个明显的副作用是 JVM 会使用更多的 RAM。确保分配给机器的物理 RAM 足够。 BIRT 是一个应用程序示例,尽管没有泄漏,但由于 permgen 空间而很快失败。其次,我还将调查您的 permgen 是否存在泄漏。增加 permgen 作为预防措施很好,但如果存在内存泄漏,从长远来看,它可能对应用程序没有帮助。

例如,泄漏的驱动程序可能会导致更多的 permgen 使用。一个好的试金石是反复热部署您的应用程序并检查对 permgen 的更改。它会一直增加直到内存不足吗?然后你有泄漏。

于 2013-03-20T12:08:29.733 回答