2013-06-11 4 views
0

를 던졌습니다 :읽기 XLSX는이 라인 <strong>가 <code>PermGen Error</code></strong>을 던져 내 <code>readXlsx</code> 방법의 시작에서 OutOfMemoryError가 PermGen

XSSFWorkbook wb = new XSSFWorkbook(OPCPackage.open(is)); 

is는 HTTP 포스트를 통해 전송 엑셀 파일에 대한 InputStream입니다.

이 오류로 몇 번 업로드하려고 시도하면 tomcat이 다운되었습니다. 전송 된 파일이 005MB 중 하나도 크지 않았습니다.

어떤 이유 일 수 있습니까?

나는 이것이 결코 InputStream을 닫지 않는 것을 볼 수 있습니까?

편집 : 그것은

StackTrace: org.apache.poi.POIXMLException: java.lang.reflect.InvocationTargetException 
at org.apache.poi.xssf.usermodel.XSSFFactory.createDocumentPart(XSSFFactory.java:62) 
at org.apache.poi.POIXMLDocumentPart.read(POIXMLDocumentPart.java:403) 
at org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:155) 
at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:186) 
at classes.XLSXReader.readXLSX(XLSXReader.java:23) 
at trainweb.ParticipantUploader.uploadCourseParticipants(ParticipantUploader.java:204) 
at trainweb.ParticipantUploader.doPost(ParticipantUploader.java:139) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) 
at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190) 
at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:291) 
at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:769) 
at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:698) 
at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:891) 
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690) 
at java.lang.Thread.run(Thread.java:619) 
Caused by: java.lang.reflect.InvocationTargetException 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
at org.apache.poi.xssf.usermodel.XSSFFactory.createDocumentPart(XSSFFactory.java:60) 
... 23 more 
Caused by: java.lang.OutOfMemoryError: PermGen space 
at java.lang.String.intern(Native Method) 
at org.apache.xmlbeans.impl.piccolo.util.CharStringConverter.convert(CharStringConverter.java:110) 
at org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.yytext2(PiccoloLexer.java:3319) 
at org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.parseElementNameNS(PiccoloLexer.java:2360) 
at org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.parseOpenTagNS(PiccoloLexer.java:1455) 
at org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.parseTagNS(PiccoloLexer.java:1362) 
at org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.yylex(PiccoloLexer.java:4678) 
at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.yylex(Piccolo.java:1290) 
at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.yyparse(Piccolo.java:1400) 
at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.parse(Piccolo.java:714) 
at org.apache.xmlbeans.impl.store.Locale$SaxLoader.load(Locale.java:3439) 
at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1270) 
at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1257) 
at org.apache.xmlbeans.impl.schema.SchemaTypeLoaderBase.parse(SchemaTypeLoaderBase.java:345) 
at org.openxmlformats.schemas.drawingml.x2006.main.ThemeDocument$Factory.parse(Unknown Source) 
at org.apache.poi.xssf.model.ThemesTable.<init>(ThemesTable.java:44) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at sun.reflect.Native 
+0

'OPCPackage.open (is)'또는'new XSSFWorkbook (...)'이 오류를 일으 킵니까? 메모리가 부족한 이유에 대한 힌트가 있으면 설명서를 볼 수 있음을 알고 계십시오. – tbraun89

+0

실행에 사용하는 환경을 알려주십시오. 응용 프로그램 서버 또는 독립 실행 형 응용 프로그램? –

+0

@UwePlonus ** Tomcat **에서 응용 프로그램이 실행 중입니다. (그의 질문에서) – tbraun89

답변

0

PermGen 당신이 당신의 JVM에서 새로운 자바 클래스의 공간을 소진 것을 의미 실제로 PermGen 오류로 인한 XSSFWorkbook를 선언하는 선에서 POIXMLException입니다. 아마 당신은 이미 한계에 다다 랐고, 큰 라이브러리를 처음 사용하려고하자마자 필요한 모든 클래스를로드 할 수 없습니다.

-XX : MaxPermSize = 128m과 같이 -XX : MaxPermSize = ...를 JVM에 전달하여 제한을 늘려야합니다.

+1

나는 이것을 시도하는 것이 가장 먼저는 안된다 고 생각한다. 메모리 제한을 늘리기 전에 그는 오류가 발생한 이유를 조사해야합니다. 코드에 디자인 오류가없고 실제 메모리가 더 필요하면 올바른 옵션이됩니다. – tbraun89

0

응용 프로그램 서버 나 웹 서버와 같은 환경에서 실행할 때로드되는 클래스 수가 너무 많습니다. 그러므로 응용 프로그램 서버 (또는 Tomcat과 같은 웹 응용 프로그램 서버)에서 실행할 때 PermSize를 늘리십시오.

이렇게하려면 -XX:MaxPermSize=...m을 서버 시작 java 명령에 추가하십시오. 추가 매개 변수를 추가하는 방법은 서버 설명서를 참조하십시오.

사용 된 JRE가 Oracle의 것이 아니면 주어진 매개 변수가 다를 수 있습니다.