27

每 15-30 分钟 Netbeans 显示一个“ java.lang.OutOfMemoryError: PermGen space”。根据我从 Google 那里了解到的情况,这似乎与一般的类加载器泄漏或内存泄漏有关。

不幸的是,我发现的所有建议都与应用程序服务器有关,我不知道将它们调整到 Netbeans。(我什至不确定这是同一个问题)

我的应用程序有问题吗?我怎样才能找到源头?

4

5 回答 5

33

这是因为不断的类加载。

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

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

  • 热重新部署期间的 Web 和应用程序服务器;
  • 运行已开发应用程序时的 IDE(每次您在 Netbeans 或 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)。

于 2009-03-23T15:11:17.470 回答
4

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

于 2009-03-23T14:57:58.780 回答
3

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

-Xmx512m -Xms512m -XX:MaxPermSize=512m

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

于 2011-12-06T10:27:37.067 回答
2

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

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

于 2009-03-23T14:54:08.663 回答
1

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

于 2009-03-23T14:55:18.630 回答