Java 永久发电:默认值的容量是固定的还是会根据需要增长?

Java 永久发电:默认值的容量是固定的还是会根据需要增长?,java,memory-management,garbage-collection,permanent-generation,Java,Memory Management,Garbage Collection,Permanent Generation,我们注意到,运行Solaris 10的客户的永久GC容量从50%增长到97%。这个JVM使用的是默认值“permgen”(我们没有向JVM传递任何定制的permgen标志) 我们应该设置更高的permgen值,而不是在生产中以97%的permgen空间运行吗 另外:我们在solaris 10上使用JDK1.6.023 更新 我们是否应该认为,在不久的将来,它可能会发生OutofMemory错误?或者JVM是否可能增加容量,从而使使用率降至97%以下?您的推理有点不清楚 如果您预计会失败,为什么不

我们注意到,运行Solaris 10的客户的永久GC容量从50%增长到97%。这个JVM使用的是默认值“permgen”(我们没有向JVM传递任何定制的permgen标志)

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

另外:我们在solaris 10上使用JDK1.6.023

更新
我们是否应该认为,在不久的将来,它可能会发生OutofMemory错误?或者JVM是否可能增加容量,从而使使用率降至97%以下?

您的推理有点不清楚


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

PermGen将增长到预定的最大值(您可以从命令行设置),然后停止。PermGen区域主要保存类定义,在加载大量类而不发布它们的应用程序中,PermGen通常会用完——要么是因为它们太大,要么是因为在web应用程序中,在类加载器发布后,某个类意外地被某个类保留。您需要确定PermGen是否不断增长,或者它是否最终稳定。

应用程序代码中使用的PermGen空间,或者您正在使用的库中使用的PermGen空间

例如,我们经常看到在ApacheTomcat中运行webapp时出现问题,该应用程序使用Spring和log4j。如果webapp实例被重新加载太多次,显然log4j存在一些问题,它无法从类加载程序中正确卸载某些类


因此,是的,有可能存在导致永久性内存空间随时间增长的泄漏,就像正常内存泄漏一样。

有一个最大永久性内存大小,当达到此si时,会出现OutOfMemoryError。但是,如果您的空间已满97%,并不意味着您已达到最大值,只占当时分配空间的97%。(如果可能的话,还需要增加3%的空间)

我们注意到我们的客户 正在运行Solaris 10的系统具有永久性 GC容量从50%增长到97%

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

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

有一点是肯定的,以97%的速度运行太接近最大值了,您将不得不使用max perm gen参数(因此,其他堆参数……最有可能)

此JVM正在使用默认值 “permgen”(我们没有通过任何 将自定义Permgen标志添加到JVM)

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

我们是否应该认为,在不久的将来,它可能会发生OutofMemory错误

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

而不是以97%的渗透率运行 空间在生产中,我们应该设定一个 更高的永久值

对。如果您(或您的客户)能够描述或估计应用程序的内存(包括perm和heap)需求(以及当前和未来可能的流量),您应该给自己10%-20%的利润,以防万一。少一点就是玩火。任何更有可能的事情都是浪费

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

如果您没有使用visualgc,您应该。这是一个很好的工具,可以直观地检查JVM内存中不同段的情况。还有visualvm,它功能更强大,用途更广,然而,visualgc UI的阅读演示特别适合于这项任务

附言:我们正在使用JDK1.6.0è23 solaris 10


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

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

  • permgen堆大小从可配置的初始大小开始
  • 如果在permgen收集之后,使用的permgen堆与permgen堆大小的比率大于给定值,则它将被扩展
  • permgen堆大小可能会增长到可配置的最大大小
现在,如果在GC之后permgen堆已满97%,那么permgen很可能已经扩展到配置的最大大小(在您的情况下是默认值)

很难说什么地方即将发生OOME。(这取决于您的应用程序的行为,以及是什么导致它增加permgen的使用量。)但是,谨慎的做法是:

  • 短期内增加更大的最大permgen堆大小,以及
  • 跟踪导致permgen堆使用率增加的原因

这是一个很好的观察结果,但我认为它应该作为原始帖子下的评论,而不是答案。很好的观察,这就是为什么我们要问这个问题。我们不知道PermGen的容量是否会增加,或者JVM是否会发出OutOfMemoryError。”……因此,对于其他堆参数,大多数