我经常在我的java(web)应用程序中看到High Perm Gen。
jmap命令,经常显示它是90%使用的。但它似乎没有给我的应用程序带来任何问题。我的整体堆使用率非常低(大约400 MB,其中最大内存设置为2048 MB)。
管理生产中的应用程序的团队担心PermGen很高。而且经常出现各种各样的问题。
问题:
(1)我是否需要担心,因为PermGen很高,当垃圾收集发生时PermGen不会降下来吗?
(2)如果我将最大PermGen尺寸加倍(当前为200 MB),会不会产生任何副作用?
答案 0 :(得分:1)
您有三件事需要担心:堆,烫发和总驻留内存。
在用完之前,你不必担心烫发。尝试增加价值。
副作用是消耗更多的RAM。您的统计数据表明您可以使用更多的perm gen和更小的最大堆。
您真正关心的不应该是时间点值。由于这是一个Web应用程序,您需要观察堆,perm gen和总驻留内存,并了解它们如何随着时间的推移而发展。
如果GC能够控制所有内容并且服务器可以处理典型和峰值负载,那么你有一个不错的应用程序。如果它随着时间的推移而增长,您可能需要担心内存泄漏。
您部署了哪个应用服务器?这很重要。与完整的Java EE应用服务器相比,Tomcat应用程序在总驻留内存上要轻得多。
答案 1 :(得分:1)
(1)我是否需要担心因为PermGen很高,不会 当垃圾收集发生时,PermGen会崩溃吗?
不。 PermGen是为加载类信息而保留的空间。除非说Web容器取消部署WAR文件并且不再需要类,否则它不能被垃圾收集。
(2)如果我将最大PermGen尺寸加倍(当前为200 MB),那么 这有什么副作用吗?
第一个明显的副作用是JVM会使用更多的RAM。确保分配给计算机的物理RAM足够。 BIRT is an example of an app虽然没有泄漏但由于permgen空间而很快失败。其次,我还会调查你的permgen是否有泄漏。增加你的permgen作为一个预防步骤是好的,但如果有内存泄漏,它可能无法在较长时间内帮助应用程序。
leaking driver for example会导致更多的permgen使用。一个很好的试金石是反复热部署你的应用程序并检查permgen的变化。它会不断增加,直到你的内存不足为止?然后你有泄漏。