2010-08-11 45 views
2

最近,在使用Netbeans 6.8处理JSF Web应用程序时,我经常收到PermGen:内存不足错误。我也注意到,这与代码的热插拔无关,正如一些人在论坛上提出的那样;无论何时重新部署代码,我通常都会重新启动本地Web服务器Tomcat 6.0。这曾经在一段时间发生在我身上,但到最近,它一直在不断发生。在坠毁之前,我通常不能超过两分钟。Netbeans Java调试器出现内存不足错误

我对这个问题所做的重要观察是,它似乎只在运行调试器时发生。如果我经常启动服务器,它将无限期地运行。只要我在调试模式下运行,就会出现此问题。

我已经尝试了迄今为止在Tomcat中增加Java的JAVA_OPT内存设置的所有提示;我试着在netbeans.conf中增加Netbeans的可用内存。仍然没有运气。如果您想查看我所做的特定配置更改,我也可以发布。

我也读过这可能是Java中的内存泄漏的结果。我试过运行Netbean的分析器,但是在我能做任何真正有用的事情之前,它通常会崩溃。另外,当它运行时,所有具有荒谬世代的对象分配都是java库中的东西,或者是基本元素 - char []是应用程序中最大的内存,例如最大的一代。

我真的很想知道是否有人有类似的问题,如果是的话,他们如何解决它。这开始严重阻碍了我的工作能力。

感谢您的任何帮助。

+0

netbeans.conf显示** - J-XX:PermSize = 32m -J-XX:MaxPermSize = 200m **? – JoseK 2010-08-12 10:14:13

+0

我以前设置了相同的值1024m。我改变了你的建议,分别设置为256和512。现在,它崩溃了不同。尽管它曾经因PermGen错误而立即炸毁,但现在它通常只是挂起,有时我会得到一个实际的错误,而其他时候,它会无限期地挂起。 – Lee 2010-08-12 18:34:20

+0

您需要首先使用堆转储来识别泄漏的对象以及使它们活着的对象。一旦你知道这一点,你可以立即解决问题(如果它足够简单并且你熟悉代码所在的代码),或者使用分析器来查明泄漏实例的分配位置。 您可以使用jmap或visualvm(jvisualvm)来获取堆转储。为了分析,你也可以使用visualvm,但是当然你可以选择你喜欢的任何工具 - 例如。 MAT如果你想坚持免费的工具。 – 2010-08-19 11:07:53

回答

2

加入catlina.sh(或蝙蝠)该条目,它为我工作

JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 
    -server -Xms1536m -Xmx1536m 
    -XX:NewSize=256m -XX:MaxNewSize=512m -XX:PermSize=512m 
    -XX:MaxPermSize=512m -XX:+DisableExplicitGC 
+0

谢谢你,我在调试一个tomcat应用程序的时候,在Netbeans中搞砸了这些设置,直到你的问题让它全部点击。感谢您的回答。 – Zoidberg 2013-06-11 11:33:32

+0

@Zoidberg:最受欢迎.. – 2013-06-12 03:57:24

0

东西我已经找到追查内存泄漏有用而不运行探查器或调试器是使用“JMAP -histo“命令(带有jdk)。将该程序的输出保存到文件中。在应用程序运行时,每隔几分钟运行一次。收集输出并查找总是数量和大小不断增加的对象。我甚至写了一个快速应用程序来绘制选定对象的图形,以便真正突出显示运行中的对象,以便更容易地查看可能发生泄漏的位置。