NetBeans中出现java.lang.OutOfMemoryError: Java heap space错误

15

当我在NetBeans启动的Tomcat servlet容器的实例中运行我的Web应用程序时,我遇到了以下错误。为了解决这个问题,我甚至更改了netbeans.conf文件中的堆大小,但仍然显示相同的错误。该怎么避免发生这种情况?

HTTP状态码500 -
--------------------------------------------------------------------------------
异常报告类型
信息
说明 服务器遇到内部错误()无法完成此请求。
异常
javax.servlet.ServletException: Servlet执行引发异常 org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:362)
根本原因
java.lang.OutOfMemoryError: Java堆空间
注意 完整的根本原因堆栈跟踪可在Apache Tomcat/5.5.9日志中找到。

https://dev59.com/43RB5IYBdhLWcg3wJUeu - erickson
https://dev59.com/KHRB5IYBdhLWcg3wSVYI - Steen
这个问题的正确答案实际上是https://dev59.com/pHRB5IYBdhLWcg3wHkLi#721281。得到高票的答案是另一个问题的好答案。 - vkraemer
5个回答

30

在 netbeans.conf 中更改堆大小仅更改 NetBeans 本身的堆大小,而不影响通过 NetBeans 运行的应用程序。

正确的方法是右键单击项目,选择“属性”,然后选择“运行”;在那里您可以适当地设置 VM 选项(-Xmx256m,例如)。它应该看起来像这样:

setting the heap size
(感谢 VonC 找到这张图片。)


真的。 +1. 尽管,如果我是写这个答案的人,我会包括图片 http://www.javapassion.com/handsonlabs/nbprofilermemory/index_files/3_heap17.png,来自http://www.javapassion.com/handsonlabs/nbprofilermemory/ ;) (但那只是我:我总是包含图片)。 - VonC
我总是包含图片:正如你最近注意到的那样:https://dev59.com/3kfRa4cB1Zd3GeqP6BR6(在评论中) - VonC
你怎么找到合适的图片呢?我试着找了一张截图,但没找到。 - Michael Myers
@divya:你能给我们提供一张截图或其他什么吗?我现在已经卸载了所有的Web应用程序插件,所以我无法轻松地重现你的问题。 - Michael Myers
1
我认为这不适用于Servlet项目...只适用于桌面项目。 - James Schek
显示剩余2条评论

9

停止Tomcat服务器,设置环境变量CATALINA_OPTS,然后重新启动Tomcat服务器。查看文件tomcat-install/bin/catalina.shcatalina.bat中如何使用该变量。例如:

set CATALINA_OPTS="-Xms512m -Xmx512m" (Windows)export CATALINA_OPTS="-Xms512m -Xmx512m" (ksh/bash)setenv CATALINA_OPTS "-Xms512m -Xmx512m" (tcsh/csh)

catalina.batcatallina.sh中,您可能已经注意到CATALINA_OPTS、JAVA_OPTS或两者都可以用来指定Tomcat JVM选项。
CATALINA_OPTS是特定于Tomcat Servlet容器的名称,而JAVA_OPTS可能被其他Java应用程序(例如JBoss)使用。由于环境变量被所有应用程序共享,我们不希望Tomcat无意间选择为其他应用程序预期的JVM选项。我更喜欢使用CATALINA_OPTS。
如何在JBoss中设置Java堆大小?
停止JBoss服务器,编辑$JBOSS_HOME/bin/run.conf,然后重新启动JBoss服务器。您可以将带有JAVA_OPTS的行更改为以下内容:
JAVA_OPTS="-server -Xms128m -Xmx128m"

如何在Eclipse中设置Java堆大小?
您有两个选项:
1. 编辑eclipse-home/eclipse.ini文件,将其修改为以下内容,并重新启动Eclipse。
-vmargs -Xms64m -Xmx256m
2. 或者,在命令行运行eclipse时,在最后添加额外的选项。在-vmargs之后的任何内容都将被视为JVM选项并直接传递给JVM。以这种方式在命令行中指定的JVM选项将始终覆盖eclipse.ini中的选项。例如,
eclipse -vmargs -Xms64m -Xmx256m
如何在NetBeans中设置Java堆大小?
退出NetBeans,编辑文件netbeans-install/etc/netbeans.conf。例如,
netbeans_default_options="-J-Xms512m -J-Xmx512m -J-XX:PermSize=32m -J-XX:MaxPermSize=128m -J-Xverify:none

如何在Apache Ant中设置Java堆大小?
设置环境变量ANT_OPTS。查看文件$ANT_HOME/bin/ant或%ANT_HOME%\bin\ant.bat,了解Ant运行时如何使用此变量。
set ANT_OPTS="-Xms512m -Xmx512m" (Windows)export ANT_OPTS="-Xms512m -Xmx512m" (ksh/bash)setenv ANT_OPTS "-Xms512m -Xmx512m" (tcsh/csh) 

7

如果您增加Tomcat服务器的虚拟内存,那么就没问题了。

步骤:

  1. 在NB中,通过窗口菜单添加服务
  2. 您会在服务中找到Tomcat。右键单击Tomcat服务器,选择属性
  3. 进入属性中的平台,在VM选项字段中写入 -Xms512m

1
本答案描述了如何重新配置NetBeans创建的Java进程以运行Tomcat Servlet容器,该容器是由内存不足的JVM运行的。 - vkraemer

5

我猜增加内存不会解决问题。MonitorFilter在做什么?是什么导致了内存的占用?

你最好弄清楚这个问题。如果这是一个Web应用程序,尝试关闭该过滤器并运行它。如果成功了,那么你就知道MonitorFilter导致了失败。


1
有时候我会陷入回答问题的泥淖中,而忽略了真正的问题所在。 - Michael Myers
1
+1 OP 也绝对应该审查一下那个类是否存在过多的对象创建等问题。 - Dana the Sane
1
@mmyers - 因为这种情况发生在我们所有人身上,所以我给你点赞。 8) - duffymo

3
这与NetBeans无关(也许有点关系),而是与Tomcat有关。Tomcat是正在耗尽堆空间的进程,而不是NetBeans。找到Tomcat的启动过程。如果它与NB捆绑在一起,那么Tomcat就隐藏在NB安装中,检查是否有一个“enterpriseN”目录,其中N是一个数字,Tomcat可能在那里,而且这是一个相当通用的分发版。
至于为什么监视器会运行OOM,这很难说,当您考虑它时,它是一个非常简单的过程。您还可以尝试禁用HTTP监视以查看是否存在监视本身的问题或应用程序的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接