[jboss-user] [JBoss jBPM] - Is this a mem. leak
Johan.Parent
do-not-reply at jboss.com
Thu Jan 18 11:25:16 EST 2007
Hi all,
As a test I have wrapped up the Websale demo code in a loop. In the loop a process is instantiated (one at a time) and the different tasks are handled (See fullCycle() in code below).
Initially one iteration takes 0.2 secs (not too fast...) but performance drops after a while.
After some 4000 iterations the process consumes 256+Mb of mem (and with my jvm settings) slows down to a crawl. As far as I can see the jvm spends most of its time doing "stop the world" gc's.
I put the code below. Can anyone take the code and try to reproduce the drop in performance and/or increasing mem. consumption?
Note you'll need a few more files which come with the starters kit.
Regards,
Johan
| package JBpmTest;
|
| /**
| * Created by IntelliJ IDEA.
| * User: jparent
| * Date: 15-jan-2007
| * Time: 13:26:08
| * To change this template use File | Settings | File Templates.
| */
| public class MainWebsaleTest {
| static public void main(String[] args) {
| WebsaleTest sale = new WebsaleTest();
| int loops[] = { 5000 };
| JBpmTiming timer = new JBpmTiming("global");
| JBpmTiming one = new JBpmTiming("single");
|
| try {
| sale.setUp();
|
| for (int count = 0; count<loops.length; count++) {
| System.out.println("Number of loops " + loops[count]);
|
| timer.reset();
| timer.start();
| for (int i = 0; i<loops[count]; i++) {
| one.reset();
| one.start();
| sale.fullCycle();
| System.out.println(i + " " + one.stop());
| }
|
| timer.stop();
| System.out.println("Number of loops " + loops[count]);
| timer.print();
| }
|
| sale.tearDown();
| }
| catch(Exception e) {
| e.printStackTrace();
| }
| }
| }
|
The slightly MODIFIED Websale
| package JBpmTest;
|
| /**
| * Created by IntelliJ IDEA.
| * User: jparent
| * Date: 15-jan-2007
| * Time: 13:00:29
| * To change this template use File | Settings | File Templates.
| */
| /*
| public class WebsaleTest {
| }
| */
|
|
| import java.util.HashMap;
| import java.util.List;
| import java.util.Map;
|
| import org.jbpm.JbpmConfiguration;
| import org.jbpm.context.exe.ContextInstance;
| import org.jbpm.db.AbstractDbTestCase;
| import org.jbpm.graph.def.ProcessDefinition;
| import org.jbpm.graph.exe.ProcessInstance;
| import org.jbpm.identity.Entity;
| import org.jbpm.identity.hibernate.IdentitySession;
| import org.jbpm.identity.xml.IdentityXmlParser;
| import org.jbpm.taskmgmt.exe.TaskInstance;
| import org.jbpm.taskmgmt.exe.TaskMgmtInstance;
|
| public class WebsaleTest extends AbstractDbTestCase {
|
| JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();
|
| ProcessDefinition processDefinition = null;
| ProcessInstance processInstance = null;
| ContextInstance contextInstance = null;
| TaskMgmtInstance taskMgmtInstance = null;
| long processInstanceId = -1;
|
| boolean doUnitTest = false;
|
| public void setUp() throws Exception {
| super.setUp();
| deployProcess();
| loadIdentities();
| newTransaction();
| }
|
| private void deployProcess() {
| ProcessDefinition processDefinition =
| ProcessDefinition.parseXmlResource("websale.par/processdefinition.xml");
| jbpmContext.deployProcessDefinition(processDefinition);
| }
|
| private void loadIdentities() {
| // load the identities
| Entity[] entities = IdentityXmlParser.parseEntitiesResource("hsqldb/identity.db.xml");
| IdentitySession identitySession = new IdentitySession(session);
| for (int i=0; i<entities.length; i++) {
| identitySession.saveEntity(entities);
| }
| newTransaction();
| }
|
| private void createNewProcessInstance() {
| processDefinition = graphSession.findLatestProcessDefinition("websale");
| processInstance = new ProcessInstance(processDefinition);
| contextInstance = processInstance.getContextInstance();
| taskMgmtInstance = processInstance.getTaskMgmtInstance();
| }
|
|
| public void testWebSaleOrderTaskParameters() {
| TaskInstance taskInstance = processInstance.getTaskMgmtInstance().createStartTaskInstance();
| assertEquals("create new web sale order", taskInstance.getName());
| assertEquals(0, taskInstance.getVariables().size());
| }
|
| public void testPerformWebSaleOrderTask() {
| TaskInstance taskInstance = null;
|
| jbpmContext.setActorId("cookie monster");
| // create a task to start the websale process
| taskInstance = processInstance.getTaskMgmtInstance().createStartTaskInstance();
|
| Map taskVariables = new HashMap();
| taskVariables.put("item", "cookies");
| taskVariables.put("quantity", "lots of them");
| taskVariables.put("address", "sesamestreet 46");
|
| taskInstance.addVariables(taskVariables);
| taskInstance.end();
|
| assertEquals("cookies", contextInstance.getVariable("item"));
| assertEquals("lots of them", contextInstance.getVariable("quantity"));
| assertEquals("sesamestreet 46", contextInstance.getVariable("address"));
| assertEquals("cookie monster", taskMgmtInstance.getSwimlaneInstance("buyer").getActorId());
| }
|
| public void testEvaluateAssignment() {
| TaskInstance taskInstance = null;
|
| jbpmContext.setActorId("cookie monster");
| // create a task to start the websale process
| taskInstance = processInstance.getTaskMgmtInstance().createStartTaskInstance();
| taskInstance.setVariable("item", "cookies");
| taskInstance.end();
| jbpmContext.save(processInstance);
| processInstanceId = processInstance.getId();
|
| newTransaction();
|
| List erniesTasks = taskMgmtSession.findTaskInstances("ernie");
| assertEquals(1, erniesTasks.size());
|
| TaskInstance evaluateTaskInstance = (TaskInstance) erniesTasks.get(0);
| assertEquals("ernie", evaluateTaskInstance.getActorId());
| assertEquals("evaluate web order", evaluateTaskInstance.getName());
| assertNotNull(evaluateTaskInstance.getToken());
| assertNotNull(evaluateTaskInstance.getCreate());
| assertNull(evaluateTaskInstance.getStart());
| assertNull(evaluateTaskInstance.getEnd());
| }
|
| public void testEvaluateOk() {
| TaskInstance taskInstance = processInstance.getTaskMgmtInstance().createStartTaskInstance();
| taskInstance.end();
| jbpmContext.save(processInstance);
|
| newTransaction();
|
| TaskInstance evaluateTaskInstance = (TaskInstance) taskMgmtSession.findTaskInstances("ernie").get(0);
| evaluateTaskInstance.end("ok");
| jbpmContext.save(evaluateTaskInstance);
|
| newTransaction();
|
| List erniesTasks = taskMgmtSession.findTaskInstances("bert");
| assertEquals(1, erniesTasks.size());
|
| TaskInstance waitForMoneyTaskInstance = (TaskInstance) erniesTasks.get(0);
| assertEquals("bert", waitForMoneyTaskInstance.getActorId());
| assertEquals("wait for money", waitForMoneyTaskInstance.getName());
| assertNotNull(waitForMoneyTaskInstance.getToken());
| assertNotNull(waitForMoneyTaskInstance.getCreate());
| assertNull(waitForMoneyTaskInstance.getStart());
| assertNull(waitForMoneyTaskInstance.getEnd());
| }
|
| public void testUnwritableVariableException() {
| testEvaluateAssignment();
| newTransaction();
| List erniesTasks = taskMgmtSession.findTaskInstances("ernie");
| TaskInstance evaluateTaskInstance = (TaskInstance) erniesTasks.get(0);
| // this variable is set in the task instance variables, but
| // should not be submitted to the process context variables.
| evaluateTaskInstance.setVariable("item", "this is not allowed");
| evaluateTaskInstance.end();
|
| newTransaction();
|
| processInstance = graphSession.loadProcessInstance(processInstanceId);
| contextInstance = processInstance.getContextInstance();
| // so the cookies should still be in the item process variable.
| assertEquals("cookies", contextInstance.getVariable("item"));
| }
|
| public void testEvaluateNok() {
| testEvaluateAssignment();
| newTransaction();
|
| List erniesTasks = taskMgmtSession.findTaskInstances("ernie");
| TaskInstance evaluateTaskInstance = (TaskInstance) erniesTasks.get(0);
| evaluateTaskInstance.setVariable("comment", "wtf");
| evaluateTaskInstance.end("more info needed");
| jbpmContext.save(evaluateTaskInstance);
|
| newTransaction();
|
| List cookieMonsterTasks = taskMgmtSession.findTaskInstances("cookie monster");
| assertEquals(1, cookieMonsterTasks.size());
| TaskInstance fixWebOrderDataTaskInstance = (TaskInstance) cookieMonsterTasks.get(0);
| assertEquals("cookie monster", fixWebOrderDataTaskInstance.getActorId());
| assertEquals("wtf", fixWebOrderDataTaskInstance.getVariable("comment"));
| }
|
| public void testMoreInfoNeeded() {
| TaskInstance taskInstance = null;
|
| jbpmContext.setActorId("cookie monster");
|
| // create a task to start the websale process
| taskInstance = processInstance.getTaskMgmtInstance().createStartTaskInstance();
| taskInstance.end();
| jbpmContext.save(processInstance);
|
| newTransaction();
|
| TaskInstance evaluateTaskInstance = (TaskInstance) taskMgmtSession.findTaskInstances("ernie").get(0);
| evaluateTaskInstance.end("more info needed");
| jbpmContext.save(evaluateTaskInstance);
|
| newTransaction();
|
| List cookieMonsterTasks = taskMgmtSession.findTaskInstances("cookie monster");
| assertEquals(1, cookieMonsterTasks.size());
|
| TaskInstance fixWebOrderDataTaskInstance = (TaskInstance) cookieMonsterTasks.get(0);
| assertEquals("cookie monster", fixWebOrderDataTaskInstance.getActorId());
| assertEquals("fix web order data", fixWebOrderDataTaskInstance.getName());
| assertNotNull(fixWebOrderDataTaskInstance.getToken());
| assertNotNull(fixWebOrderDataTaskInstance.getCreate());
| assertNull(fixWebOrderDataTaskInstance.getStart());
| assertNull(fixWebOrderDataTaskInstance.getEnd());
| }
|
| public void fullCycle() {
| createNewProcessInstance();
|
| TaskInstance taskInstance = null;
|
| jbpmContext.setActorId("cookie monster");
| // create a task to start the websale process
| taskInstance = processInstance.getTaskMgmtInstance().createStartTaskInstance();
| taskInstance.setVariable("item", "cookies");
| taskInstance.end();
| jbpmContext.save(processInstance);
| processInstanceId = processInstance.getId();
|
| newTransaction();
|
| List erniesTasks = taskMgmtSession.findTaskInstances("ernie");
|
| if (doUnitTest)
| assertEquals(1, erniesTasks.size());
|
| if (erniesTasks.size() > 0) {
| TaskInstance evaluateTaskInstance = (TaskInstance) erniesTasks.get(0);
|
| if (doUnitTest) {
| assertEquals("ernie", evaluateTaskInstance.getActorId());
| assertEquals("evaluate web order", evaluateTaskInstance.getName());
| assertNotNull(evaluateTaskInstance.getToken());
| assertNotNull(evaluateTaskInstance.getCreate());
| assertNull(evaluateTaskInstance.getStart());
| assertNull(evaluateTaskInstance.getEnd());
| }
| }
| newTransaction();
|
| erniesTasks = taskMgmtSession.findTaskInstances("ernie");
| if (erniesTasks.size() > 0) {
| TaskInstance evaluateTaskInstance = (TaskInstance) erniesTasks.get(0);
| evaluateTaskInstance.setVariable("comment", "wtf");
| evaluateTaskInstance.end("more info needed");
| jbpmContext.save(evaluateTaskInstance);
| }
|
| newTransaction();
|
| List cookieMonsterTasks = taskMgmtSession.findTaskInstances("cookie monster");
| if (doUnitTest)
| assertEquals(1, cookieMonsterTasks.size());
|
| if (cookieMonsterTasks.size() > 0) {
| TaskInstance fixWebOrderDataTaskInstance = (TaskInstance) cookieMonsterTasks.get(0);
| if (doUnitTest) {
| assertEquals("cookie monster", fixWebOrderDataTaskInstance.getActorId());
| assertEquals("wtf", fixWebOrderDataTaskInstance.getVariable("comment"));
| }
|
| fixWebOrderDataTaskInstance.end();
| }
|
| newTransaction();
|
| erniesTasks = taskMgmtSession.findTaskInstances("ernie");
|
| if (erniesTasks.size() > 0) {
| TaskInstance evaluateTaskInstance = (TaskInstance) erniesTasks.get(0);
| evaluateTaskInstance.setVariable("comment", "IS OK NOW");
| evaluateTaskInstance.end("ok");
| jbpmContext.save(evaluateTaskInstance);
| }
|
| newTransaction();
|
| List bertTasks = taskMgmtSession.findTaskInstances("bert");
| if (doUnitTest)
| assertEquals(1, bertTasks.size());
|
| if (bertTasks.size() > 0) {
| TaskInstance waitForMoneyTaskInstance = (TaskInstance) bertTasks.get(0);
| if (doUnitTest) {
| assertEquals("bert", waitForMoneyTaskInstance.getActorId());
| assertEquals("wait for money", waitForMoneyTaskInstance.getName());
| assertNotNull(waitForMoneyTaskInstance.getToken());
| assertNotNull(waitForMoneyTaskInstance.getCreate());
| assertNull(waitForMoneyTaskInstance.getStart());
| assertNull(waitForMoneyTaskInstance.getEnd());
| }
|
| waitForMoneyTaskInstance.end();
| }
|
| List groverTasks = taskMgmtSession.findTaskInstances("grover");
| if (doUnitTest)
| assertEquals(1, groverTasks.size());
|
| if (groverTasks.size() > 0) {
| TaskInstance shippingTask = (TaskInstance) groverTasks.get(0);
| shippingTask.end();
| }
|
| // Setup new session & co for next loop (not inside this method)
| newTransaction();
| }
| }
|
And the timing utility
| package JBpmTest;
|
| /**
| * Created by IntelliJ IDEA.
| * User: jparent
| * Date: 19-dec-2006
| * Time: 10:50:59
| * To change this template use File | Settings | File Templates.
| */
| public class JBpmTiming {
| private long total;
| private long min, max;
| private long count;
| private long start_time;
| String label;
|
| public JBpmTiming(String l) {
| reset();
| count = 0;
| min = 100000L;
| max = -1000000L;
| label = l;
| }
|
| public JBpmTiming() {
| this("Unknown");
| }
|
| public void start() {
| count++;
| start_time = System.currentTimeMillis ();
| }
|
| public long stop() {
| long ret = System.currentTimeMillis () - start_time ;
| total += ret;
|
| if (ret > max)
| max = ret;
|
| if (ret < min)
| min = ret;
|
| return ret;
| }
|
| public void accumulate(JBpmTiming in) {
| total += in.total;
| count += in.count;
|
| if (in.max > max)
| max = in.max;
|
| if (in.min < min)
| min = in.min;
| }
|
| void reset() {
| total = 0;
| count = 0;
| }
|
| public void print() {
| System.out.println("Name: " + label + " " + total+ "/" + min + "/" + max + "[" + total / (double)count + "|" + count + "] (tot/min/max[avg|nbr])");
| }
| }
|
|
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4003393#4003393
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4003393
More information about the jboss-user
mailing list