如何防止Netbeans中的PermGen空间错误?

每隔15-30分钟,Netbeans会显示一个“ java.lang.OutOfMemoryError: PermGen space ”。 根据我从谷歌学到的东西,这似乎与一般的类加载器泄漏或内存泄漏有关。

不幸的是,我发现的所有建议都与应用服务器有关,我不知道将它们改编为Netbeans。 (我甚至不确定这是同一个问题)

这是我申请中的问题吗? 我怎样才能找到来源?

这是因为恒定的类加载。

Java将类字节代码和所有常量(例如字符串常量)存储在永久堆中,默认情况下不会进行垃圾收集(这在大多数情况下都有意义,因为类在应用程序的生命周期中只加载一次)。

在通常在整个生命周期内加载类的应用程序中:

  • 热重新部署期间的Web和应用程序服务器;
  • IDE在运行开发的应用程序时(每次在Netbeans中运行Run按钮或eclipse时,它会将应用程序的类加载一个新的);
  • 等等这种行为是不恰当的,因为最终堆满了。

您需要打开永久堆垃圾收集以防止此错误。

我用的是选项

 -XX:MaxPermSize=256M -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled 

(阻止我的eclipse 3.4抛出“ java.lang.OutOfMemoryError: PermGen space ”,所以它也应该与netbeans一起工作)。

编辑 :请注意,对于Netbeans,您可以在以下位置设置这些选项: [Netbeans installation]\etc\netbeans.conf您应该使用-J将这些选项作为前缀,并将它们添加到netbeans_default_options (有关更多信息,请参阅netbeans.conf注释)。

尝试将以下参数添加到netbeans netconf:-J-XX:MaxPermSize = 256m

请参阅此链接 ,了解如何设置PermSize的大小。 最有可能这不是你的代码的问题,所以唯一的解决方案是增加PermSize。 当你使用JAXB时,我发现这很常见。 通常,如果您使用许多本身也依赖于许多其他jar文件的库,则PermGen空间的默认大小可能不够大。

有关更多详细信息,请参阅这些博客文章: 类加载器泄漏以及如何修复可怕的“java.lang.OutOfMemoryError:PermGen space”

如果您正在开发Web应用程序,请尝试使用服务器vm选项

-Xmx512m -Xms512m -XX:MaxPermSize = 512m

转到工具/服务器//平台/ VM选项(Netbeans 7.4)

您可以通过编辑文件/etc/netbeans.conf来更改netbeans JVM的启动选项。 当我开发Web应用程序并经常部署它时,我经常遇到这种错误。 在那种情况下,我不时重启tomcat。