当前位置: 首页 > 知识库问答 >
问题:

javax.servlet.ServletException:java.lang.OutOfMemoryError:Java堆空间

王凌
2023-03-14

我想从网页上选定的文本中提取名词,并在文本显示时突出显示它们。所以我使用OpenNLP库来解析和获取名词列表。它在java类中运行良好,没有内存问题,尽管在显示输出之前花费了6-7秒,但当我在jsp页面中运行代码时,我得到了以下错误:

    javax.servlet.ServletException: java.lang.OutOfMemoryError: Java heap space
    org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:909)
    org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:838)
    org.apache.jsp.highlightText_jsp._jspService(highlightText_jsp.java:294)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

根本原因

java.lang.OutOfMemoryError: Java heap space
    opennlp.model.AbstractModelReader.getParameters(AbstractModelReader.java:144)
    opennlp.maxent.io.GISModelReader.constructModel(GISModelReader.java:75)
    opennlp.model.GenericModelReader.constructModel(GenericModelReader.java:59)
    opennlp.model.AbstractModelReader.getModel(AbstractModelReader.java:87)
    opennlp.tools.util.model.GenericModelSerializer.create(GenericModelSerializer.java:35)
    opennlp.tools.util.model.GenericModelSerializer.create(GenericModelSerializer.java:31)
    opennlp.tools.util.model.BaseModel.loadModel(BaseModel.java:231)
    opennlp.tools.util.model.BaseModel.<init>(BaseModel.java:181)
    opennlp.tools.postag.POSModel.<init>(POSModel.java:82)
    opennlp.tools.parser.ParserModel$POSModelSerializer.create(ParserModel.java:49)
    opennlp.tools.parser.ParserModel$POSModelSerializer.create(ParserModel.java:45)
    opennlp.tools.util.model.BaseModel.finishLoadingArtifacts(BaseModel.java:303)
    opennlp.tools.util.model.BaseModel.loadModel(BaseModel.java:240)
    opennlp.tools.util.model.BaseModel.<init>(BaseModel.java:181)
    opennlp.tools.parser.ParserModel.<init>(ParserModel.java:152)
    model.parser.parserAction(parser.java:59)
    org.apache.jsp.highlightText_jsp._jspService(highlightText_jsp.java:143)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

我读到的一些解决方案建议通过这样做来增加apache tomcat的堆内存大小:

set CATALINA_OPTS=-Xms256m -Xmx512m

所以我将其设置为-Xmx2g,但仍然会产生相同的错误。我认为我不需要修改JVM堆大小(右键单击Netbeans中的project)

我以前从未犯过这个错误,所以我不知道该怎么办。谢谢你的帮助,谢谢。

共有3个答案

公西宏毅
2023-03-14

因为您提到,即使将堆内存增加到2gb,仍然存在问题,所以很明显,代码中存在内存泄漏。未使用的对象不会取消引用,以便垃圾收集器删除它们。

使用比实际需要更多的堆内存会对性能产生影响。过度配置堆内存并不能解决您的问题。相反,它的性能会很差(暂停时间过长)。您需要使用任何探查器(Java任务控制、Java Visual VM、工具包Java探查器等)来分析代码,以查看哪个对象占用堆中更多的内存空间。如果你能分享你的代码,那么我们就能找到内存泄漏的确切位置。

高宸
2023-03-14

爪哇。lang.OutOfMemoryError:当应用程序试图向堆空间区域添加更多数据,但空间不足时,会触发Java堆空间错误。解决java中OutOfMemoryError的一个简单方法是使用JVM选项“-Xmx512M”增加最大堆大小,您已经尝试过了。

在Java中解决OutOfMemoryError的第二种方法是,可以使用Eclipse内存分析器检查堆转储,也可以使用任何探查器,如Netbeans或JProbe。

在您的例子中,当您试图从网页中提取名词并突出显示它们时。所以,只要试着找出在你的代码中是否有任何循环,在一定条件下,它是一个无限循环。

朱明知
2023-03-14

对于此类问题,您可以(并且应该)使用像VisualVM这样的工具。它与jdk1.8下的JDK捆绑在一起。0_xxx\bin\jvisualvm.exe,您可以无需任何配置即可连接到本地JVM。使用该工具,您应该能够找出应用程序内存溢出的位置和原因。

 类似资料:
  • 问题内容: 我最近在具有24个CPU和32GB RAM的服务器上使用了带有Ipython的PySpark。它仅在一台机器上运行。在我的过程中,我想收集以下代码中给出的大量数据: 当我做 它给我outOfMemory错误。。另外,此错误发生后,我无法在Spark上执行任何操作,因为它失去了与Java的连接。它给。 看起来堆空间很小。如何设置更大的限制? 编辑 : 我在运行之前尝试过的事情: 我根据此

  • 问题内容: 我在执行多线程程序时遇到以下错误 上面的错误发生在其中一个线程中。 据我所知,堆空间仅由实例变量占用。如果这是正确的,那么为什么在运行一段时间后会出现此错误,因为在创建对象时分配了实例变量的空间。 有什么办法可以增加堆空间? 我应该对程序进行哪些更改,以使其占用更少的堆空间? 问题答案: 如果要增加堆空间,可以 -在命令行上使用。默认情况下,这些值基于JRE版本和系统配置。你可以在Ja

  • 我面临一些关于内存问题的问题,但我无法解决它。非常感谢您的帮助。我不熟悉Spark和pyspark功能,试图读取大约5GB大小的大型JSON文件,并使用 每次运行上述语句时,都会出现以下错误: 我需要以RDD的形式获取JSON数据,然后使用SQLSpark进行操作和分析。但是我在第一步(读取JSON)本身就出错了。我知道要读取如此大的文件,需要对Spark会话的配置进行必要的更改。我遵循了Apac

  • 我最近一直在我的服务器上使用PySpark和Ipython,服务器上有24个CPU和32GB RAM。它只在一台机器上运行。在我的过程中,我想收集大量的数据,如下代码所示: 当我做的时候 它给了我outOfMemory错误。。此外,我不能在此错误后对Spark执行任何操作,因为它失去了与Java的连接。它给出了。 看起来堆空间很小。我怎么才能把它设置到更大的限度呢? 编辑: 运行前尝试的内容: 我

  • 我使用javaml训练分类器。现在,我的数据中的实例包含如下格式的向量 1 0:5 1:9 24:2 ...... 所以当我从文件中读取这些时,我使用string.split.然后将值放入稀疏实例中,然后将其添加到分类器中。 然而,我得到了一个堆空间内存错误。我读过关于字符串的文章。split()导致内存泄漏,因此我使用了新的String来避免内存泄漏。然而,我仍然面临堆空间问题 代码如下所示 /

  • 问题内容: Java内存空间(Perm空间,Space Stack,堆空间)之间有什么区别? JVM什么时候使用一个或另一个? 如果我使用Scala / Groovy / etc等,会有区别吗? 问题答案: 只是 堆空间:所有活动对象都分配在这里。 堆栈空间:在方法调用或变量实例化中存储对对象的引用以获取变量。 烫发空间:存储已加载的类信息 例如: 执行完上述行之后,内存状态将是这样。 堆:存储“