Spring状态机UML留在内存中
Spring state machine UML stays in memory
我已经使用 Spring 状态机一年多了,现在根据我的要求尝试不同的实现方式,并且在使用 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();
如您所见,我使用了 new UmlStateMachineModelFactory(resource);
UmlStateMachineModelFactory Class 有以下代码
@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。
这个class有
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);
这叫。我想知道这是导致堆堆积的原因。请帮忙
我将每个 gh572 的一些修复推送到 master 和 1.2.x。希望这些对你有用。至少我能够看到垃圾收集工作得更好。我计划在本周晚些时候发布。
我已经使用 Spring 状态机一年多了,现在根据我的要求尝试不同的实现方式,并且在使用 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();
如您所见,我使用了 new UmlStateMachineModelFactory(resource);
UmlStateMachineModelFactory Class 有以下代码
@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。
这个class有
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);
这叫。我想知道这是导致堆堆积的原因。请帮忙
我将每个 gh572 的一些修复推送到 master 和 1.2.x。希望这些对你有用。至少我能够看到垃圾收集工作得更好。我计划在本周晚些时候发布。