[ https://issues.apache.org/jira/browse/PDFBOX-4242?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16522498#comment-16522498 ]
Tilman Hausherr commented on PDFBOX-4242: ----------------------------------------- Surprisingly, phantomreference is not mentioned in "Effective Java". However I don't see how it would help: [http://mindprod.com/jgloss/phantom.html] "Lets you clean up after finalization but before the space is reclaimed (replaces or augments the use of finalize())" So it brings the same troubles: we don't know if an object will ever be finalized. If there is enough memory, it might never be finalized. Re "As you can't use Guava" - indeed, it needs jdk8. Is there anything in your opinion that speaks against doing what I wrote in the second and last paragraph of my previous comment? > Fontbox does not close file descriptor when loading fonts. > ---------------------------------------------------------- > > Key: PDFBOX-4242 > URL: https://issues.apache.org/jira/browse/PDFBOX-4242 > Project: PDFBox > Issue Type: Bug > Components: FontBox > Affects Versions: 2.0.9 > Reporter: Glen Peterson > Priority: Minor > Labels: file_leak > > My app has been getting "java.io.FileNotFoundException (No file descriptors > available)" and I've confirmed that it's because fontbox isn't closing it's > file descriptors. > In org.apache.fontbox.ttf.TTFParser there's this method: > {{public TrueTypeFont parse(File ttfFile) throws IOException {}} > {{ RAFDataStream raf = new RAFDataStream(ttfFile, "r");}} > {{ try {}} > {{ return this.parse((TTFDataStream)raf);}} > {{ } catch (IOException var4) {}} > {{ // close only on error (file is still being accessed later)}} > {{ raf.close();}} > {{ throw var4;}} > {{}}} > {{}}} > I would have expected to see the close() in a finally block so that the file > is always closed, not just on exceptions. Presumably, you can keep it in > memory without leaving the file descriptor open? > {{public TrueTypeFont parse(File ttfFile) throws IOException {}} > {{ RAFDataStream raf = new RAFDataStream(ttfFile, "r");}} > {{ try {}} > {{ return this.parse((TTFDataStream)raf);}} > {{ } catch (IOException var4) {}}{{ raf.close();}} > {{ throw var4;}} > {{ } finally {}} > {{ raf.close();}} > {{}}} > {{}}} > I tried performing this in a lazy initialization, but it blew up: > java.lang.RuntimeException: java.io.IOException: The TrueType font null does > not contain a 'cmap' tableCaused by: java.io.IOException: The TrueType font > null does not contain a 'cmap' table > at > org.apache.fontbox.ttf.TrueTypeFont.getUnicodeCmapImpl(TrueTypeFont.java:548) > at > org.apache.fontbox.ttf.TrueTypeFont.getUnicodeCmapLookup(TrueTypeFont.java:528) > at > org.apache.fontbox.ttf.TrueTypeFont.getUnicodeCmapLookup(TrueTypeFont.java:514) > at org.apache.fontbox.ttf.TTFSubsetter.<init>(TTFSubsetter.java:91) > at > org.apache.pdfbox.pdmodel.font.TrueTypeEmbedder.subset(TrueTypeEmbedder.java:321) > at org.apache.pdfbox.pdmodel.font.PDType0Font.subset(PDType0Font.java:239) > at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1271) > Thoughts? > Thanks for PDFBox - it's been really helpful! -- This message was sent by Atlassian JIRA (v7.6.3#76005) --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@pdfbox.apache.org For additional commands, e-mail: dev-h...@pdfbox.apache.org