[
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:32 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
..........
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();
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)