2015-01-05 4 views
0

Я получаю java.lang.OutOfMemoryError: Java heap space, и я не уверен, как этого избежать. Я пишу то, что, по моему мнению, было в основном буфером сокетов. Я думаю, что это javax.servlet.jsp.JspWriter.Почему мой код JSF получает «java.lang.OutOfMemoryError: Java heap space»?

Однако, когда я пытаюсь написать очень большой файл HTML, ~ 700 000 строк, я получаю java.lang.OutOfMemoryError: Java heap space. Я смутил, почему фреймворк не просто скрывается в socket. (Марша, Марша, Марша) Отправляясь в сторону, могу ли я сделать это в русле, а не просто увеличивать буфер.

Я использую JSF 1.1.

Обратите внимание, я стараюсь добавить этот web.xml:

<context-param> 
    <param-name>facelets.BUFFER_SIZE</param-name> 
    <param-value>500000</param-value> 
</context-param> 

Это не похоже, ничего менять.

Вот мой пример кода:

<html> 
    <f:view> 
     <head> 
      <title>Test</title> 
     </head> 
     <body id="page_body" 
      <h:form id="form"> 
       <% 
        String s; 
        for (int i = 0; i < rowCount; i++) { 
         s = data.get(i); 
         out.println(s); 
         //flush after on every thousandths row. 
         //if(i%1000==1) 
         //   out.flush(); 
        } // for loop 
       %> 
      </h:form> 
     </body> 
    </f:view> 
</html> 

Вот исключение я получаю:

org.apache.jasper.JasperException: org.apache.jasper.JasperException: javax.servlet.ServletException: java.lang.OutOfMemoryError: Java heap space 
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:549) 
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:455) 
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390) 
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
    com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:322) 
    com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:130) 
    test.CustomLocaleRemapViewHandler.renderView(CustomLocaleRemapViewHandler.java:94) 
    com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:87) 
    com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:200) 
    com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:117) 
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:198) 
    test.CustomFilter.doFilter(CustomFilter.java:46) 
    test.CustomFilter2.doFilter(CustomFilter2.java:81) 
    org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:144) 


root cause 

org.apache.jasper.JasperException: javax.servlet.ServletException: java.lang.OutOfMemoryError: Java heap space 
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:549) 
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:455) 
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390) 
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
    org.apache.jasper.runtime.PageContextImpl.doForward(PageContextImpl.java:746) 
    org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:716) 
    org.apache.jsp.test2_jsp._jspService(test2_jsp.java:122) 
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432) 
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390) 
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
    com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:322) 
    com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:130) 
    test.CustomLocaleRemapViewHandler.renderView(CustomLocaleRemapViewHandler.java:94) 
    com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:87) 
    com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:200) 
    com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:117) 
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:198) 
    test.CustomFilter.doFilter(CustomFilter.java:46) 
    test.CustomFilter2.doFilter(CustomFilter2.java:81) 
    org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:144) 


root cause 

javax.servlet.ServletException: java.lang.OutOfMemoryError: Java heap space 
    org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:912) 
    org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:841) 
    org.apache.jsp.test_jsp._jspService(test_jsp.java:745) 
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432) 
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390) 
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
    org.apache.jasper.runtime.PageContextImpl.doForward(PageContextImpl.java:746) 
    org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:716) 
    org.apache.jsp.test2_jsp._jspService(test2_jsp.java:122) 
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432) 
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390) 
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
    com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:322) 
    com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:130) 
    test.CustomLocaleRemapViewHandler.renderView(CustomLocaleRemapViewHandler.java:94) 
    com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:87) 
    com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:200) 
    com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:117) 
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:198) 
    test.CustomFilter.doFilter(CustomFilter.java:46) 
    test.CustomFilter2.doFilter(CustomFilter2.java:81) 
    org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:144) 


root cause 

java.lang.OutOfMemoryError: Java heap space 
    java.util.Arrays.copyOf(Unknown Source) 
    java.io.ByteArrayOutputStream.grow(Unknown Source) 
    java.io.ByteArrayOutputStream.ensureCapacity(Unknown Source) 
    java.io.ByteArrayOutputStream.write(Unknown Source) 
    sun.nio.cs.StreamEncoder.writeBytes(Unknown Source) 
    sun.nio.cs.StreamEncoder.implWrite(Unknown Source) 
    sun.nio.cs.StreamEncoder.write(Unknown Source) 
    java.io.OutputStreamWriter.write(Unknown Source) 
    java.io.PrintWriter.write(Unknown Source) 
    java.io.PrintWriter.write(Unknown Source) 
    test.CustomWrapper$CustomPrintWriter.write(CustomWrapper.java:82) 
    org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:119) 
    org.apache.jasper.runtime.JspWriterImpl.write(JspWriterImpl.java:336) 
    java.io.Writer.write(Unknown Source) 
    com.sun.faces.renderkit.html_basic.HtmlResponseWriter.write(HtmlResponseWriter.java:519) 
    com.sun.faces.taglib.jsf_core.ViewTag.doAfterBody(ViewTag.java:196) 
    org.apache.jsp.test_jsp._jspService(test_jsp.java:725) 
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432) 
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390) 
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 

BTW, BalusC, если там, пожалуйста, помогите. Нет давления, lol. Вы отвечаете примерно на половину вопросов JSF.

Grae

+0

Ваш вопрос подразумевает, что файлы меньшего размера работают без проблем. Это верно? – kolossus

+0

@koloossus Да, он отлично работает. Похоже, BodyContentImpl пишет на char [] cp, а не записывает в сокет. –

+0

Ничто не собирается произвольно писать на другой вывод; это простой случай количества данных, подавляющих кучу. Измените настройки размера кучи, чтобы отсортировать их. – kolossus

ответ

0

Вы можете попробовать использовать -Xmx увеличить размер кучи.
Для использования apache tomcat, то есть экспорта CATALINA_OPTS = "- Xmx1024M"