我已经关注这段代码很长一段时间了,试图减少代码使用的内存量,但它仍然生成了java.lang.OutOfMemoryError: Java heap space。作为我最后的手段,我想问社区我如何改进这段代码以避免OutOfMemoryError
我有一个驱动程序/清单文件(.txt文件),其中包含有关PDF的信息。我有大约2000-5000 pdf在一个压缩文件中,我需要结合在一起。在合并之前,对于每个pdf,我需要添加2-3多个pdf页面到它。Manifest对象保存有关pdf的信息。
try{
blankPdf = new PdfReader(new FileInputStream(config.getBlankPdf()));
mdxBacker = new PdfReader(new FileInputStream(config.getMdxBacker()));
theaBacker = new PdfReader(new FileInputStream(config.getTheaBacker()));
mdxAffidavit = new PdfReader(new FileInputStream(config.getMdxAffidavit()));
theaAffidavit = new PdfReader(new FileInputStream(config.getTheaAffidavit()));
ImmutableList<Manifest> manifestList = //Read manifest file and obtain List<Manifest>
File zipFile = new File(config.getInputDir() + File.separator + zipName);
//Extracting PDF into `process` folder
ZipUtil.extractAll(config.getExtractPdfDir(), zipFile);
outputPdfName = zipName.replace(".zip", ".pdf");
outputZipStream = new FileOutputStream(config.getOutputDir() +
File.separator + outputPdfName);
document = new Document(PageSize.LETTER, 0, 0, 0, 0);
writer = new PdfCopy(document , outputZipStream);
document.open(); //Open the document
//Start combining PDF files together
for(Manifest m : manifestList){
//Obtain full path to the current pdf
String pdfFilePath = config.getExtractPdfDir() + File.separator + m.getPdfName();
//Before combining PDF, add backer and affidavit to individual PDF
PdfReader pdfReader = PdfUtil.addBackerAndAffidavit(config, pdfType, m,
pdfFilePath, blankPdf, mdxBacker, theaBacker, mdxAffidavit,
theaAffidavit);
for(int pageNumber=1; pageNumber<=pdfReader.getNumberOfPages(); pageNumber++){
document.newPage();
PdfImportedPage page = writer.getImportedPage(pdfReader, pageNumber);
writer.addPage(page);
}
}
} catch (DocumentException e) {
} catch (IOException e) {
} finally{
if(document != null) document.close();
try{
if(outputZipStream != null) outputZipStream.close();
if(writer != null) writer.close();
}catch(IOException e){
}
}请放心,我已经看了这段代码很长时间了,并尝试多次重写它,以减少它使用的内存量。在OutOfMemoryError之后,仍然有很多pdf文件没有添加2-3个额外的页面,所以我认为它在addBackerAndAffidavit中,然而,我试图关闭我打开的每一个资源,但它仍然异常。请帮帮忙。
发布于 2011-09-27 04:17:28
您需要在每个循环结束时调用PdfWriter#freeReader()来释放所涉及的PdfReader。PdfCopy#freeReader()具有从PdfWriter继承的此方法,并执行相同的操作。另请参阅javadoc
freeReader
公共空freeReader(PdfReader阅读器)抛出IOException
从类复制的描述:PdfWriter
使用此方法将读取器写入文档并释放其使用的内存。主要用于连接多个文档,以将内存使用限制在当前追加的文档中。
覆盖:
类PdfWriter中的freeReader
参数:
reader --免费的PdfReader
抛出:
IOException - on error
https://stackoverflow.com/questions/7560235
复制相似问题