高PermGen,但堆使用率低

时间:2013-03-20 11:56:18

标签: java performance memory heap permgen

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

jmap命令,经常显示它是90%使用的。但它似乎没有给我的应用程序带来任何问题。我的整体堆使用率非常低(大约400 MB,其中最大内存设置为2048 MB)。

管理生产中的应用程序的团队担心PermGen很高。而且经常出现各种各样的问题。

问题:
 (1)我是否需要担心,因为PermGen很高,当垃圾收集发生时PermGen不会降下来吗?
 (2)如果我将最大PermGen尺寸加倍(当前为200 MB),会不会产生任何副作用?

2 个答案:

答案 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的变化。它会不断增加,直到你的内存不足为止?然后你有泄漏。