如何防止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。