我想从我的网页上选择的文本中提取名词,并在文本为displayed.So时突出显示它们。我使用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 > Properties > Run > VM Options > set -Xmx中右键单击项目),但是尝试了一下,并不成功。
以前从来没有出现过这个错误,所以我不知道该怎么做。感谢您的帮助,谢谢。
发布于 2017-03-13 16:29:32
对于这类问题,您可以(也应该)使用VisualVM之类的工具。它与jdk1.8.0_xxx\bin\jvisualvm.exe下的JDK捆绑在一起,您无需任何配置即可连接到本地JVM。使用该工具,您应该能够找出应用程序内存不足的位置和原因。
发布于 2017-03-13 16:34:57
当应用程序尝试向堆空间区域添加更多数据,但是没有足够的空间容纳它时,将触发java.lang.OutOfMemoryError: Java heap space错误。在java中解决OutOfMemoryError的一个简单方法是使用JVM选项"-Xmx512M“增加最大堆大小,您已经尝试过了。
在Java语言中解决OutOfMemoryError的第二种方法是,您可以使用Eclipse Memory Analyzer检查堆转储,也可以使用Netbeans或JProbe等任何分析器。
在你的例子中,当你试图从网页中提取名词并突出显示它们时。所以,试着找出在你的代码中,是否有任何循环,在某些条件下,变成了无限循环。
发布于 2017-03-15 05:20:34
由于您提到即使将堆内存增加到2 2gb仍然存在问题,因此很明显您的代码中存在内存泄漏。未使用的对象不会被解除引用,因此它们将被垃圾收集器移除。
使用比实际需要更多的堆内存会对性能产生影响。在您的情况下,过度提供堆内存并不能解决问题。相反,它的性能会很差(停顿时间很长)。您需要使用任何分析器(Java to、Java Visual VM、Kit java profiler等)来分析代码。查看哪个对象占用堆中更多的内存空间。如果你可以分享你的代码,那么我们将能够找到内存泄漏发生的确切位置。
https://stackoverflow.com/questions/42758964
复制相似问题