0

我们注意到运行 Solaris 10 的客户的永久 GC 容量从 50% 增长到 97%。此 JVM 使用默认值“permgen”(我们没有将任何自定义 Permgen FLAG 传递给 JVM)。

我们应该设置更高的 PermGen 值,而不是在生产中以 97% 的 permgen 空间运行?

PS:我们在 solaris 10 上使用 JDK 1.6.0_23。

更新 我们是否应该认为它很快就会发生 OutOfMemoryError ?或者 JVM 是否有可能增加容量以使使用率降至 97% 以下?

4

6 回答 6

2

PermGen 将增长到预定的最大值(您可以从命令行设置)然后停止。PermGen 区域主要包含类定义,通常在加载大量类但不释放它们的应用程序中,您会用完 PermGen——要么因为它们太大,要么在 Web 应用程序中,因为某些东西意外保留类加载器释放后的类。你需要确定 PermGen 是不断增长,还是最终稳定下来。

于 2011-03-25T13:30:19.357 回答
2

使用的 PermGen 空间可能会随着时间的推移而增长到应用程序代码或您正在使用的库中的某些内存泄漏/错误。

例如,在使用 Spring 和 log4j 的 Apache Tomcat 中运行 webapp 时,如果 webapp 实例重新加载太多次,我们经常会看到问题,显然 log4j 存在一些问题,即它无法从类加载器中正确卸载某些类。

所以是的,有可能导致 PermGen 空间随着时间的推移而增长的泄漏,就像正常的内存泄漏一样。

于 2011-03-25T13:33:22.150 回答
1

你的推理有点不清楚。

如果您预计会失败,为什么不采取防御措施并-XX:MaxPermSize立即增加呢?

于 2011-03-25T13:29:33.277 回答
1

我相信 JVM 将使用与普通堆相同的策略来扩展 permgen 堆。

  • permgen 堆大小从可配置的初始大小开始
  • 如果 permgen 收集后已用 permgen heap 与 permgen heap size 的比率大于给定值,它将被扩展。
  • permgen 堆大小可能会增长到可配置的最大大小

现在,如果在 GC 之后 permgen 堆已满 97%,那么 permgen 很可能已经扩展到配置的最大大小(在您的情况下为默认值)。

不可能说 OOME 即将到来。(这取决于您的应用程序的行为方式,以及导致它增加 permgen 使用的原因。)但是,谨慎的做法是:

  • 在短期内增加更大的最大 permgen 堆大小,并且
  • 追踪导致 permgen 堆使用量增加的原因。
于 2011-03-25T14:53:03.203 回答
1

我们注意到运行 Solaris 10 的客户的永久 GC 容量从 50% 增长到 97%。

在注意到 perm gen 的峰值之前,您的客户的应用程序中是否有重大的代码更改?还是一直都是这样(从 50% 到 97%)?

我想此时这并不重要,但在某些情况下,在系统测试期间应该可以检测到这样的尖峰(假设您的团队在客户的系统测试周期中具有可见性。)

可以肯定的一件事是,以 97% 的速度运行太接近舒适度的最大值,您将不得不使用 max perm gen 参数(并且因此使用其他堆参数......很可能。)

此 JVM 使用默认值“permgen”(我们没有将任何自定义 Permgen FLAG 传递给 JVM)。

不是一个好主意。在部署之前,您应该(必须阅读)始终表征您的(或您的客户)应用程序。您的客户应该告诉您他们需要什么参数,或者您的团队必须在 UAT 和系统测试周期期间确定这些参数(假设您对这些有可见性;见上文。)

我们是否应该认为它很快就会发生 OutOfMemoryError ?

这不是不可避免的,但有可能(特别是如果应用程序尚未承受最大可能负载时)。如果峰值是最近出现的现象,也有可能。在这种情况下,很可能是由于代码更改或由于其他因素(操作系统中的补丁、容器中的补丁、客户流量的变化、数据库中的变化等)导致的先前未知的情况。

我们应该设置更高的 PermGen 值,而不是在生产中以 97% 的 permgen 空间运行?

海事组织,是的。如果您(或您的客户)可以描述或估计应用程序的内存(永久和堆)需求(以及当前和未来可能的流量),您应该给自己 10%-20% 的保证金,以防万一。少了就是玩火。任何更有可能的东西都是浪费的。

内存可能很便宜,但应用程序的性能和稳定性却不是 ;)

如果你没有使用visualgc,你应该。这是一个很好的工具,可以直观地检查 JVM 内存中不同段的情况。还有visualvm,它更强大、更通用,然而,读数的visualgc UI呈现特别适合这个任务。

PS:我们在 solaris 10 上使用 JDK 1.6.0_23。

我不认为这应该重要。您的应用程序容器是什么(如果您的应用程序在一个容器中运行。)您可能需要编辑您的帖子以包含它。

于 2011-03-25T13:47:04.353 回答
0

有一个最大 PermGen 大小,当达到这个 si 时你会得到一个 OutOfMemoryError。但是,如果您已使用 97% 的空间,这并不意味着您已达到最大容量,而只是当时分配的空间的 97%。(如果可以的话,在另外 3% 的情况下,它必须扩大空间)

于 2011-03-25T13:45:09.517 回答