首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >javax.servlet.ServletException: java.lang.OutOfMemoryError: Java堆空间

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

Stack Overflow用户
提问于 2017-03-13 16:11:03
回答 3查看 5.3K关注 0票数 1

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

代码语言:javascript
复制
    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)

根本原因

代码语言:javascript
复制
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的堆内存大小:

代码语言:javascript
复制
set CATALINA_OPTS=-Xms256m -Xmx512m

因此,我将其设置为-Xmx2g,但它仍然给出相同的错误。我不认为我需要修改JVM堆大小(在Netbeans > Properties > Run > VM Options > set -Xmx中右键单击项目),但是尝试了一下,并不成功。

以前从来没有出现过这个错误,所以我不知道该怎么做。感谢您的帮助,谢谢。

EN

回答 3

Stack Overflow用户

发布于 2017-03-13 16:29:32

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

票数 0
EN

Stack Overflow用户

发布于 2017-03-13 16:34:57

当应用程序尝试向堆空间区域添加更多数据,但是没有足够的空间容纳它时,将触发java.lang.OutOfMemoryError: Java heap space错误。在java中解决OutOfMemoryError的一个简单方法是使用JVM选项"-Xmx512M“增加最大堆大小,您已经尝试过了。

在Java语言中解决OutOfMemoryError的第二种方法是,您可以使用Eclipse Memory Analyzer检查堆转储,也可以使用Netbeans或JProbe等任何分析器。

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

票数 0
EN

Stack Overflow用户

发布于 2017-03-15 05:20:34

由于您提到即使将堆内存增加到2 2gb仍然存在问题,因此很明显您的代码中存在内存泄漏。未使用的对象不会被解除引用,因此它们将被垃圾收集器移除。

使用比实际需要更多的堆内存会对性能产生影响。在您的情况下,过度提供堆内存并不能解决问题。相反,它的性能会很差(停顿时间很长)。您需要使用任何分析器(Java to、Java Visual VM、Kit java profiler等)来分析代码。查看哪个对象占用堆中更多的内存空间。如果你可以分享你的代码,那么我们将能够找到内存泄漏发生的确切位置。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42758964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档