[ https://issues.apache.org/jira/browse/ODFTOOLKIT-300?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14900708#comment-14900708 ]
surfx edited comment on ODFTOOLKIT-300 at 9/25/15 3:33 PM: ----------------------------------------------------------- [25/Sep/15] Bom a solução mais rápida para este problema seria se o desenvolvedor criasse um método clearRepository, na classe SelectionManager, deixando a mesma pública, desta forma: clase Selection (package br.gov.serpro.requer.core.odf), subclasse public static class SelectionManager (deixe-a como pública) Método: public static void clearRepository() { repository.clear(); } .... Para resolver este problema, importamos todas as seguintes classes em nosso projeto: CellSelection FieldSelection GerarAcordao2 ImageSelection LoadObjFromOdt Navigation ParagraphSelection SaveObjToOdt Selection TableSelection TextDocumentSelection TextNavigation TextSelection Alterando apenas a classe Selection, subclasse SelectionManager: public static class SelectionManager { //deixe-a pública .......... //crie este método public static void clearRepository() { repository.clear(); } .......... Depois no seu código basta chamar desta forma: TextNavigation search = new TextNavigation(tag, textDocument); while (search.hasNext()) { TextSelection item = (TextSelection) search.nextSelection(); FieldSelection fieldSelection = new FieldSelection(item); fieldSelection.replaceWith(conteudo != null ? conteudo : ""); } Selection.SelectionManager.clearRepository(); was (Author: surfx): [25/Sep/15] Bom a solução mais rápida para este problema seria se o desenvolvedor criasse um método clearRepository, na classe SelectionManager, deixando a mesma pública, desta forma: clase Selection (package br.gov.serpro.requer.core.odf), subclasse public static class SelectionManager (deixe-a como pública) Método: public static void clearRepository() { repository.clear(); } .... Para resolver este problema, importamos todas as seguintes classes em nosso projeto: CellSelection FieldSelection GerarAcordao2 ImageSelection LoadObjFromOdt Navigation ParagraphSelection SaveObjToOdt Selection TableSelection TextDocumentSelection TextNavigation TextSelection Alterando apenas a classe Selection, subclasse SelectionManager: public static class SelectionManager { //deixe-a pública .......... public static void clearRepository() { //crie este método repository.clear(); } .......... Depois no seu código basta chamar desta forma: TextNavigation search = new TextNavigation(tag, textDocument); while (search.hasNext()) { TextSelection item = (TextSelection) search.nextSelection(); FieldSelection fieldSelection = new FieldSelection(item); fieldSelection.replaceWith(conteudo != null ? conteudo : ""); } Selection.SelectionManager.clearRepository(); > Memory Leak in ODF Simple API > ----------------------------- > > Key: ODFTOOLKIT-300 > URL: https://issues.apache.org/jira/browse/ODFTOOLKIT-300 > Project: ODF Toolkit > Issue Type: Bug > Components: simple api > Affects Versions: 0.5-incubating > Environment: odfdom-java-0.8.7.jar; simple-odf-0.6.6.jar > Reporter: Mathias Silbermann > Assignee: Devin Han > Attachments: MemoryLeak_300.java, TestTextSelection.odt > > > There is a memory leak in the ODF Simple API. I tried both, versions 0.6.6 > and 0.6.5. It appears when running code like the examples on cookbook page > http://incubator.apache.org/odftoolkit/simple/document/cookbook/Manipulate%20TextSearch.html > In short, the call TextNavigation.nextSelection() leads to the leak. When you > look down the method's call stack, you will find that items are added to the > static variable "repository" of the static inner class > "Selection.SelectionManager". The added items are never removed from the > repository. One indication is that the method > Selection.SelectionManager.unregisterItem() is never called. > The code works fine if text navigation is done with few documents. But when > its run on a server thousands of times, it will fill the JVMs memory. -- This message was sent by Atlassian JIRA (v6.3.4#6332)