Spring State Machine UML остается в памяти - PullRequest
0 голосов
/ 02 июля 2018

Я работаю с машинами Spring State уже более года, пробуя различные способы реализации в соответствии с моими требованиями, и я столкнулся с серьезной проблемой при использовании UML.

Я использую папирус для рисования UML, и у меня есть много UML, хранящихся в определенном месте. Тот, который мне нужен, выбирается динамически. Это было сделано успешно. Теперь я столкнулся с серьезной проблемой. Ниже приведен код того, как я назвал UML.

Resource resource = new FileSystemResource(stmDir+"/"+model+".uml");

        UmlStateMachineModelFactory umlBuilder = new UmlStateMachineModelFactory(resource);
        umlBuilder.setStateMachineComponentResolver(resolveActionConfig(model));
        StateMachineModelFactory<String, String> modelFactory = umlBuilder;

        Builder<String, String> builder = StateMachineBuilder.builder();
        builder.configureModel().withModel().factory(modelFactory);
        builder.configureConfiguration().withConfiguration().beanFactory(new StaticListableBeanFactory());

        stateMachine = builder.build();

И, как вы можете видеть, я использую новый UmlStateMachineModelFactory (resource);

Класс UmlStateMachineModelFactory имеет следующий код

@Override
public StateMachineModel<String, String> build() {
    Model model = null;
    try {
        model = UmlUtils.getModel(getResourceUri(resolveResource()).getPath());
    } catch (IOException e) {
        throw new IllegalArgumentException("Cannot build build model from resource " + resource + " or location " + location, e);
    }
    UmlModelParser parser = new UmlModelParser(model, this);
    DataHolder dataHolder = parser.parseModel();
    // we don't set configurationData here, so assume null
    return new DefaultStateMachineModel<String, String>(null, dataHolder.getStatesData(), dataHolder.getTransitionsData());
}

и каждый раз, когда я создаю один UmlStateMachineModelFactory, он, в свою очередь, создает один UmlModelParser.

Этот класс имеет

import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.uml2.uml.Activity;
import org.eclipse.uml2.uml.Constraint;
import org.eclipse.uml2.uml.Event;
import org.eclipse.uml2.uml.Model;
import org.eclipse.uml2.uml.OpaqueBehavior;
import org.eclipse.uml2.uml.OpaqueExpression;
import org.eclipse.uml2.uml.PackageableElement;
import org.eclipse.uml2.uml.Pseudostate;
import org.eclipse.uml2.uml.PseudostateKind;
import org.eclipse.uml2.uml.Region;
import org.eclipse.uml2.uml.Signal;
import org.eclipse.uml2.uml.SignalEvent;
import org.eclipse.uml2.uml.State;
import org.eclipse.uml2.uml.StateMachine;
import org.eclipse.uml2.uml.TimeEvent;
import org.eclipse.uml2.uml.Transition;
import org.eclipse.uml2.uml.Trigger;
import org.eclipse.uml2.uml.UMLPackage;
import org.eclipse.uml2.uml.Vertex;

Они остаются в моей памяти, из-за чего они занимают большой объем памяти и не собираются сборщиком мусора. Это вызывает много проблем, поскольку мы используем это для крупномасштабного приложения, и каждые несколько минут создается много экземпляров.

Пожалуйста, предложите обходной путь.

РЕДАКТИРОВАТЬ - Мне удалось создать одноэлементную оболочку для этой проблемы, но, несмотря на это, она сохраняется. Мой коллега обнаружил, что загруженные ресурсы не выгружаются. поэтому каждый раз, когда я вызываю builder.build (),

 ResourceSet resourceSet = new ResourceSetImpl();
    resourceSet.getPackageRegistry().put(UMLPackage.eNS_URI, UMLPackage.eINSTANCE);
    resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put(UMLResource.FILE_EXTENSION, UMLResource.Factory.INSTANCE);
    resourceSet.createResource(modelUri);
    Resource resource = resourceSet.getResource(modelUri, true);

это называется. Интересно, это вызывает накопление кучи. Пожалуйста, помогите

1 Ответ

0 голосов
/ 10 июля 2018

Я внес несколько исправлений за gh572 в мастер и 1.2.x. Надеюсь, эти работы для вас. По крайней мере, я смог увидеть сборку мусора, чтобы работать лучше. Я планирую выпустить релизы позже на этой неделе.

...