선택 필드를 표시하기 위해 처리를 위해 80,193KB FITS 파일을 업로드 할 때 추적에서 아래에 설명 된 오류가 발생했습니다. 기본적으로 나는 사용자가 업로드 및 처리를 위해 최대 6 개의 FITS 파일을 선택할 수있는 모의 웹 인터페이스를 가지고 있습니다. 두 개의 [다른] FITS 파일 (각각 약 54,574KB)을 처리를 위해 이동 중에 업로드하면 오류가 발생하지 않습니다. 필드는 콘솔에 표시되거나 인쇄됩니다. 그러나 하나의 80,193KB 파일을 업로드 할 때 아래 오류가 발생합니다. 어떻게 해결합니까?java.lang.OutOfMemoryError : Java 힙 공간
나는 처음 반복 계산 비싼 것을 생각하지만 난 80메가바이트 파일의 readHDU를 호출에이 occcurs 의심 : I 효율적으로 해결하기를 해결하려면 어떻게
while ((newBasicHDU = newFits.readHDU()) != null) {
를? 나는 7 건배
Windows에서 프로그램을 실행 해요추적 :
SEVERE: Servlet.service() for servlet FitsFileProcessorServlet threw exception
java.lang.OutOfMemoryError: Java heap space
at java.lang.reflect.Array.multiNewArray(Native Method)
at java.lang.reflect.Array.newInstance(Unknown Source)
at nom.tam.util.ArrayFuncs.newInstance(ArrayFuncs.java:1028)
at nom.tam.fits.ImageData.read(ImageData.java:258)
at nom.tam.fits.Fits.readHDU(Fits.java:573)
at controller.FITSFileProcessor.processFITSFile(FITSFileProcessor.java:79)
at controller.FITSFileProcessor.doPost(FITSFileProcessor.java:53)
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.coyote.http11.Http11Processor.process(Http11Processor.java:849)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
at java.lang.Thread.run(Unknown Source)
코드 : 톰캣에 충분한 메모리를 할당되지 않은 것 같은
/**
*
* @param
* @return
*/
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
// Check that we have a file upload request
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (isMultipart) {
Fits newFits = new Fits();
BasicHDU newBasicHDU = null;
ServletFileUpload upload = new ServletFileUpload(); // Create a new file upload handler
// Parse the request
try {
//List items = upload.parseRequest(request); // FileItem
FileItemIterator iter = upload.getItemIterator(request);
// iterate through the number of FITS FILES on the Server
while (iter.hasNext()) {
FileItemStream item = (FileItemStream) iter.next();
if (!item.isFormField()) {
this.processFITSFile(item, newFits,newBasicHDU);
}
}
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
*
* @param
* @return
*/
public void processFITSFile(FileItemStream item, Fits newFits, BasicHDU newBasicHDU) throws IOException {
// Process the fits file
if (!item.isFormField()) {
String fileName = item.getName(); //name of the FITS File
try {
System.out.println("Fits File Fields Printout: " + fileName);
InputStream fitsStream = item.openStream();
newFits = new Fits(fitsStream);
System.out.println("number of hdu's if: " + newFits.getNumberOfHDUs());
while ((newBasicHDU = newFits.readHDU()) != null) { //line 76
System.out.println("Telescope Used: " + newBasicHDU.getTelescope());
System.out.println("Author: " + newBasicHDU.getAuthor());
System.out.println("Observer: " + newBasicHDU.getObserver());
System.out.println("Origin: " + newBasicHDU.getOrigin());
System.out.println("End of Printout for: \n" + fileName);
System.out.println();
}
fitsStream.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
'-Xmx' 스위치를 사용하여 VM에서 사용할 수있는 힙 크기를 늘려 보았습니까? –
사용하는 API가 반복자 스타일 액세스를 지원합니까? 즉 So java는 전체 파일을 처리 할 때 읽을 필요가 없으며 시간에 기록 만 남습니다. 그것이 당신이하고있는 것에 대한 옵션이 아니라면, 그렉의 제안에 따라 힙 크기를 늘려야 할 것입니다. – Mike
아니요 아직 – Terman