Hello Filip, I see you already found a sufficient work around, but thanks for the reference of the potential issue. Just translated the latest comment, perhaps someone could take this <https://issues.apache.org/jira/browse/ODFTOOLKIT-300?focusedCommentId=15094330&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-15094330> over. Review and test it and create a path.
Kind regards, Svante On Tue, Jan 12, 2016 at 7:23 AM, Cossaer Filip <[email protected]> wrote: > Dear Svante, > > > > I already found out what the “memory leak” was. > > There is also a bug tracker for it, but seems unresolved : > > https://issues.apache.org/jira/browse/ODFTOOLKIT-300 > > > > The odfdom-java-0.8.7.jar is indeed used in the project. > > > > I resolved the issue by writing mine own search, witch is a lot simpler > because I don’t need to check headers or footers for the use case. > > Also, I need always the first occurrence so a simple recursive search did > the trick. > > > > Thx in advance. > > > > Filip > > > > > > *From:* Svante Schubert [mailto:[email protected]] > *Sent:* maandag 11 januari 2016 23:15 > *To:* [email protected]; Cossaer Filip > *Subject:* Re: suspect memory leak > > > > Hi Cossaer, > > > > when I pasted your test function into a test case I realized that you seem > to work with an older Simple API, as > > > > search.getCurrentItem(); > > > > does no longer exist. Have you tried with building it with the latest > sources? > > > > The problem is obvious part of the Simple API, which I am personally not > using and which originally was donated by IBM. > > > > I therefore suggest to update to the latest sources and if the error still > occurs give the common memory tooling a try, for instance: > > > http://developerblog.redhat.com/2014/08/14/find-fix-memory-leaks-java-application/ > > > > I am curious on your results.. > > > > Best regards, > > Svante > > > > > > > > > > On Tue, Jan 5, 2016 at 2:06 PM, Cossaer Filip <[email protected]> > wrote: > > Hi there, > > > > I came upon the following situation when I used this method, I have a > OutOfMemory error. > > When I do remove the usage of this method, everything is oke. > > TextNavigation or TextSelection doesn’t implement the Closeable interface > so I normally don’t have to close them. > > > > private void replace(String searchField, String data, OdfTextDocument > document) throws InvalidNavigationException { > > TextNavigation search = new TextNavigation(searchField, document); > > while (search.hasNext()) { > > TextSelection item = (TextSelection) search.getCurrentItem(); > > item.replaceWith(data); > > } > > } > > > > To give a situation, I’m building PDF’s(approx. 30k) from an ODT template > (already byte[] in code) > > We need to inject some data into the template and then we save it to the > DB. > > > > Can you confirm this is a memory leak in your part or the issue is with me? > > > > The usage is in this part : > > > > > > /** > > * Creates all the bulletins from the given templates, with data > stored in the extractor. > > * > > * @throws Exception => createPdf(Bulletin bulletin, String[] data) > throws Exception so can't be more specified here. > > */ > > public void createBulletins() throws Exception { > > Map<Bulletin, byte[]> bulletins = Maps.newHashMap(); > > for (Entry<String, String[]> entry : > extractor.getCsv().entrySet()) { > > readedSize++; > > Bulletin bulletin = createBulletin(entry.getValue()); > > bulletins.put(bulletin, createPdf(bulletin, entry.getValue())); > > if (bulletins.size()>=SAVE_SIZE) { > > LOGGER.info("Saved " + SAVE_SIZE + " to the DB"); > > bulletinService.saveBulletins(bulletins); > > this.report.addReaded(SAVE_SIZE); > > bulletins = Maps.newHashMap(); > > } > > } > > this.report.addReaded(bulletins.size()); > > bulletinService.saveBulletins(bulletins); > > } > > > > /** > > * > > * @param bulletin bulletin info what needs to be filled in > > * @param data the data what must be injected into the template. > > * @return the created bulletin. > > * @throws Exception => OdfTextDocument.loadDocument throws raw > exception so can't be more specified here. > > */ > > private byte[] createPdf(Bulletin bulletin, String[] data) throws > Exception { > > InputStream in = null; > > OdfTextDocument document = null; > > ByteArrayOutputStream output = null; > > try { > > if ("NL".equalsIgnoreCase(data[LANGUAGE])) { > > Objects.requireNonNull(templateNL, "Nederlandstalige > template is niet aanwezig."); > > Objects.requireNonNull(extractor.getBulletinTitle(), > "Nederlandstalige titel is niet aanwezig."); > > in = new ByteArrayInputStream(templateNL); > > bulletin.setTitle(extractor.getBulletinTitle()); > > } else if ("FR".equalsIgnoreCase(data[LANGUAGE])) { > > Objects.requireNonNull(templateFR, "Franstalige template > is niet aanwezig."); > > Objects.requireNonNull(extractor.getBulletinTitleFR(), > "Franstalige titel is niet aanwezig."); > > in = new ByteArrayInputStream(templateFR); > > bulletin.setTitle(extractor.getBulletinTitleFR()); > > } else { > > throw new IOException("Kan niet vinden of het NL of FR > moet zijn. Is deze op de 3de entry in de csv?"); > > } > > document = OdfTextDocument.loadDocument(in); > > > > > > //TODO : FIX OutOfMEM issue > > // replace("%name%", data[NAME], document); > > // replace("%firstName%", data[FIRST_NAME], document); > > // replace("%street%", data[STREET], document); > > // replace("%city%", data[ZIP] + " " + data[CITY], document); > > // replace("%birthDate%", data[BIRTH_DATE], document); > > // replace("%formNr%", data[NUMBER], document); > > // replace("%sendDate%", "//TODO : TO BE CONFIRMED", document); > > // replace("%employedBy%", data[EMPLOYD_BY], document); > > > > output = new ByteArrayOutputStream(); > > document.save(output); > > PdfConverter.getInstance().convert(document, output, options); > > > > output.flush(); > > return output.toByteArray(); > > } finally { > > close(in); > > close(document); > > close(output); > > > > } > > } > > > > > > Thx in advance. > > > > Filip > > > > > > The best way to learn *anything* on the Internet > > isn't to post a question but instead to post the wrong answer. > > No one wants to help the noob that can't figure it out, > > but everyone wants to correct the guy who is wrong. > > > > Filip Cossaer > 1SM > CC V&C > > 9-6321-10435 > > Intranet <http://intranet.mil.intra/sites/Portal/Pages/Default.aspx> > > > > > > This e-mail and any attachments may contain sensitive and > > privileged information. If you are not the intended recipient, > > please notify the sender immediately by return e-mail, > > delete this e-mail and destroy any copies. > > Any dissemination or use of this information by a person other > > than the intended recipient is unauthorized and may be illegal. > > > > *************************************************************** > > Your E-mail has been scanned against Potential Virus and Spyware/Grayware > > dangers by the MOD BE SECURITY SYSTEMS. > > > > This e-mail and any attachments may contain sensitive and > privileged information. If you are not the intended recipient, > please notify the sender immediately by return e-mail, > delete this e-mail and destroy any copies. > Any dissemination or use of this information by a person other > than the intended recipient is unauthorized and may be illegal. > >
