每 15-30 分钟 Netbeans 显示一个“ java.lang.OutOfMemoryError: PermGen space
”。根据我从 Google 那里了解到的情况,这似乎与一般的类加载器泄漏或内存泄漏有关。
不幸的是,我发现的所有建议都与应用程序服务器有关,我不知道将它们调整到 Netbeans。(我什至不确定这是同一个问题)
我的应用程序有问题吗?我怎样才能找到源头?
每 15-30 分钟 Netbeans 显示一个“ java.lang.OutOfMemoryError: PermGen space
”。根据我从 Google 那里了解到的情况,这似乎与一般的类加载器泄漏或内存泄漏有关。
不幸的是,我发现的所有建议都与应用程序服务器有关,我不知道将它们调整到 Netbeans。(我什至不确定这是同一个问题)
我的应用程序有问题吗?我怎样才能找到源头?
这是因为不断的类加载。
Java 将类字节码和所有常量(例如字符串常量)存储在默认情况下不会被垃圾回收的永久堆中(这在大多数情况下是有意义的,因为类在应用程序的生命周期中只加载一次)。
在通常在整个生命周期中加载类的应用程序中:
您需要打开永久堆垃圾回收以防止出现此错误。
我使用选项
-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
如果您正在开发 Web 应用程序,请尝试使用服务器 vm 选项
-Xmx512m -Xms512m -XX:MaxPermSize=512m
转到工具/服务器//平台/VM 选项(Netbeans 7.4)
请参阅此链接了解如何设置 PermSize 的大小。很可能这不是您的代码的问题,因此唯一的解决方案是增加 PermSize。当您使用 JAXB 时,我发现这很常见。一般来说,如果你使用很多库,而这些库本身也依赖于很多其他的 jar 文件,那么 PermGen 空间的默认大小可能不够大。
有关更多详细信息,请参阅这些博客文章:类加载器泄漏和如何修复可怕的“java.lang.OutOfMemoryError: PermGen space”
您可以通过编辑文件 /etc/netbeans.conf 来更改 netbeans JVM 的启动选项。我在开发 Webapp 并经常部署它时经常会遇到这种错误。在那种情况下,我会不时重启tomcat。