2013-09-11 2 views
1

Я пытаюсь решить эту проблему, которая возникает только при загрузке любого большого файла (размером 500 МБ). В настоящее время, что я сделал это следующим образомjava из памяти: пустое место с сервисом Tomcat 7

enter image description here

Однако я все еще получаю эту ошибку на моем контроллере (я использую Spring MVC)

org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet [mvc-dispatcher] in context with path [] threw exception [Handler processing failed; nested exception is java.lang.OutOfMemoryError: Java heap space] with root cause 
java.lang.OutOfMemoryError: Java heap space 
    at com.dnag2.controller.DownloadController.extractFile(DownloadController.java:39) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936) 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118) 
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 

ОБНОВЛЕНО (функцию, которая загружает файл)

@RequestMapping(value = "/files/{file_name}/d", method = RequestMethod.GET) 
    @ResponseBody 
    public byte[] extractFile(@PathVariable("file_name") String fileName, 
      HttpServletResponse response) { 
     try { 
      File file = new File("C:\\" + fileName); 
      InputStream is = new FileInputStream(file); 
      response.setContentType("application/pdf"); 
      response.setHeader("Content-Disposition", "attachment;filename=\"" 
        + file.getName() + "\""); 
      ; 
      int read = 0; 
      byte[] bytes = new byte[(int) file.length()]; 
      OutputStream os = response.getOutputStream(); 

      while ((read = is.read(bytes)) != -1) { 
       os.write(bytes, 0, read); 
      } 
      os.flush(); 
      os.close(); 
      is.close(); 
      return bytes; 
     } catch (IOException ex) { 
      throw new RuntimeException("IOError writing file to output stream"); 
     } 
    } 

Что еще я пропустил?

+2

Что код 'com.dnag2.controller.DownloadController'? Вы загружаете весь файл в память? –

+0

Что такое настройки пространства кучи? -Xmx – JIV

+0

Обновлен мой вопрос с помощью связанного фрагмента кода. – abiieez

ответ

4

Вы загружая весь файл в память:

byte[] bytes = new byte[(int) file.length()]; 

Конечно это ломается. Это не то, как вы обрабатываете загрузки. Вы должны написать прямо в потоке ответов HTTP.

Вот пример сервлета делает это: http://www.java-forums.org/blogs/servlet/668-how-write-servlet-sends-file-user-download.html

+0

Была ли такая же проблема для java REST webservice .. Есть ли способ решить эту проблему в REST? – Harshawardhan

Смежные вопросы