我在跟蹤中描述了以下錯誤,當我嘗試上傳一個80,193KB FITS文件進行處理時,爲了顯示選擇的字段。基本上我有一個模擬web界面,允許用戶選擇最多6個FITS文件進行上傳和處理。當我上傳兩個[不同的] FITS文件(每個大約54,574KB)時,我不會收到錯誤。這些字段在控制檯上顯示/打印。然而,在上傳單個80,193KB文件時,我得到下面的錯誤。我如何解決它?java.lang.OutOfMemoryError:Java堆空間
我最初以爲迭代當時正在計算昂貴的,但我懷疑它occcurs上調用readHDU爲80MB的文件:
while ((newBasicHDU = newFits.readHDU()) != null) {
如何解決有效地解決這個問題?我在Windows上運行的程序7.乾杯
跟蹤:
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'開關增加虛擬機可用的堆大小? – 2010-02-25 19:06:10
您使用的API是否支持迭代器樣式訪問?也就是說,Java不需要讀取整個文件來處理它,只需要記錄一次。如果這不是你正在做的選擇,你需要遵循Greg的建議並增加堆大小。 – Mike 2010-02-25 19:11:20
不,我還沒有 – Terman 2010-02-25 19:13:25