Java 永久发电:默认值的容量是固定的还是会根据需要增长?
我们注意到,运行Solaris 10的客户的永久GC容量从50%增长到97%。这个JVM使用的是默认值“permgen”(我们没有向JVM传递任何定制的permgen标志) 我们应该设置更高的permgen值,而不是在生产中以97%的permgen空间运行吗 另外:我们在solaris 10上使用JDK1.6.023 更新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%以下?您的推理有点不清楚 如果您预计会失败,为什么不
我们是否应该认为,在不久的将来,它可能会发生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堆大小可能会增长到可配置的最大大小
- 短期内增加更大的最大permgen堆大小,以及
- 跟踪导致permgen堆使用率增加的原因