You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@pdfbox.apache.org by "Andreas Lehmkühler (JIRA)" <ji...@apache.org> on 2016/06/11 12:09:20 UTC

[jira] [Commented] (PDFBOX-3376) Memory leak in PDDcoument.close method

    [ https://issues.apache.org/jira/browse/PDFBOX-3376?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15325836#comment-15325836 ] 

Andreas Lehmkühler commented on PDFBOX-3376:
--------------------------------------------

There are some issues with your figures:
- you didn't trigger a garbage collection before calculating the memory consumption
- Runtime.totalMemory is just a indicator for the memory consumption, nothing more. If the memory is freed by running the gc the value for the allocated free memory of the jdk isn't necessarily decreased to the starting value

A better approach is to use a profiling tool to get a detailed overview of the memory situation, e.g. I'm using jvisualvm which comes with the jdk, but there are others available.

> Memory leak in PDDcoument.close method
> --------------------------------------
>
>                 Key: PDFBOX-3376
>                 URL: https://issues.apache.org/jira/browse/PDFBOX-3376
>             Project: PDFBox
>          Issue Type: Bug
>          Components: PDModel
>    Affects Versions: 2.0.1
>            Reporter: Yan
>
> PDFBox PDDocument still uses memory after destruction. This causes, surprisingly, memory leaks in Java. Sample code:
> {code}
> import java.io.File;
> import java.io.IOException;
> import java.util.List;
> import java.util.Vector;
> import org.apache.pdfbox.pdmodel.PDDocument;
> //javac -cp pdfbox.jar:commons-logging.jar Mrg.java
> //java -cp pdfbox.jar:commons-logging.jar:. Mrg *pdf
> public class Mrg
> {
> 	public static void main(String[] args) throws Exception
> 	{
> 		Runtime instance = Runtime.getRuntime();
> 		System.err.println("Start: "+instance.totalMemory());
> 		List <PDDocument> infiles = new Vector<PDDocument>();
> 		String outname = "Output.pdf";
> 		for(int i=0; i<args.length; i++)
> 			infiles.add(PDDocument.load(new File (args[i])));
> 		PDDocument result = new PDDocument();
> 		for (PDDocument input : infiles)
> 		{
> 			int inpages = input.getNumberOfPages();					
> 			for (int i=0; i<inpages; ++i)
> 				result.addPage(input.getPage(i));
> 		}
> 		try	{
> 			result.save(outname);
> 		} catch (IOException e) {
> 			System.err.println(e.getMessage());
> 			System.exit(1);
> 		}
> 		result.close();
> 		Thread.currentThread().sleep(1000);
> 		System.err.println("All open: "+instance.totalMemory());
> 		for (PDDocument i : infiles)
> 			i.close();
> 		Thread.currentThread().sleep(1000);
> 		System.err.println("All closed: "+instance.totalMemory());
> 		(new java.util.Scanner(System.in)).nextLine();
> 		System.err.println("Finish: "+instance.totalMemory());
> 	}
> }
> {code}
> Mine output:
> >Start: 125829120
> >All open: 277872640
> >All closed: 277872640
> >rthrth
> >Finish: 277872640
> The same happens with my main program (I was blaming SwingWorker): https://github.com/Yanpas/PdfMerger



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@pdfbox.apache.org
For additional commands, e-mail: dev-help@pdfbox.apache.org