2017-03-13 56 views
0

我想從網頁上的選定文本中提取名詞,並在顯示文本時突出顯示它們。因此,我使用OpenNLP庫進行解析並獲取列表的名詞。它運行在Java中類不帶記憶問題,但花了6-7秒顯示輸出前,但是當我運行jsp頁面的代碼中,我得到了這些錯誤:javax.servlet.ServletException:java.lang.OutOfMemoryError:Java堆空間

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>屬性>運行> VM選項>設置-Xmx中右鍵單擊項目),但嘗試過但沒有成功。

從未有過這個錯誤,所以我不知道該怎麼辦。感謝任何幫助,謝謝。

+0

您是否嘗試分析您的代碼並查看哪些對象正在創建,哪些正在使用最大內存,內存泄漏的可能性等?你的Oracle JDK帶有VisualVM,它可以讓你開始.. – anacron

+0

我想這種方式喲是增加NetBeans堆空間,但不是Tomcat堆空間。嘗試使用jconsole或visualvm連接到tomcat,並查看堆有多少內存。 – malaguna

回答

0

對於這樣的問題,你可以(也應該)使用像VisualVM這樣的工具。它通過jdk1.8.0_xxx\bin\jvisualvm.exe與JDK捆綁在一起,您可以在不進行任何配置的情況下連接到本地JVM。使用該工具,您應該能夠找出應用程序內存不足的地方和原因。

0

java.lang.OutOfMemoryError:應用程序嘗試向堆空間區域添加更多數據時會觸發Java堆空間錯誤,但是沒有足夠的空間存在。 在java中解決OutOfMemoryError的一種簡單方法是使用已嘗試的JVM選項「-Xmx512M」, 來增加最大堆大小。

解決Java中的OutOfMemoryError的第二種方法是您可以使用Eclipse Memory Analyzer來檢查堆轉儲,或者可以使用任何類似Netbeans或JProbe的分析器 。

就你而言,正如你試圖從網頁中提取名詞並突出顯示它們一樣。所以試着找出 在你的代碼中是否有任何循環,在某些情況下會變成無限循環。

+0

如果應用程序正在泄漏內存,可能的情況是,增加堆大小隻會推遲問題,而不能解決問題。 – EJP

0

由於您提到即使將堆內存增加到2GB也仍然存在問題,因此很明顯,您的代碼中存在內存泄漏。未使用的對象不被解除引用,因此它們將被垃圾收集器刪除。

使用比實際需要更多的堆內存會對性能產生影響。 過度配置堆內存不能解決您的問題。相反,它會有不佳的表現(冗長的暫停時間)。您需要使用任何分析器(Java Mission Control,Java Visual VM,Your Kit Java Profiler等)來查看您的代碼,以查看哪個對象在堆中佔用更多內存空間。如果您可以分享您的代碼,那麼我們將能夠找到發生內存泄漏的確切位置。