liangjian created PLC4X-339:
-------------------------------

             Summary: modbus connection causes memory leak
                 Key: PLC4X-339
                 URL: https://issues.apache.org/jira/browse/PLC4X-339
             Project: Apache PLC4X
          Issue Type: Bug
          Components: Driver-Modbus
    Affects Versions: 0.9.0
         Environment: Windows 10; jdk1.8 32bit
            Reporter: liangjian


Note: The version is 0.9.1.

1. The document (here)[https://plc4x.apache.org/users/protocols/modbus.html] 
seems wrong. It tells me the connection string format is: 
"modbus-tcp:tcp://127.0.0.1:502", but my test code throws exception saying no 
driver until I change it to "modbus://127.0.0.1".

2. My test code writes (or reads) some value via modbus tcp every 1 second, 
using short tcp connection (open and close every time). The memory increases 
every second until out-of-memory. In process monitor I find the thread count  
increases 1 every time the connection opens, but never releases, althought I 
consider the `try-block` shall closes it automatically. In fact, I see it calls 
`connection.close` after the `try-block`.

Test code:

```java
        while (true) {
            String connectionString = "modbus://127.0.0.1";
            try (PlcConnection plcConnection = new 
PlcDriverManager().getConnection(connectionString)) {
                PlcWriteRequest.Builder builder = 
plcConnection.writeRequestBuilder();
                builder.addItem("value-1", "holding-register:1:DINT", 30000);
                builder.addItem("value-2", "holding-register:3:REAL", 3.14);
                PlcWriteRequest writeRequest = builder.build();
                PlcWriteResponse response = writeRequest.execute().get();
                
                for (String fieldName : response.getFieldNames()) {
                    if(response.getResponseCode(fieldName) == 
PlcResponseCode.OK) {
                        System.out.println("Value[" + fieldName + "]: updated");
                    }
                    // Something went wrong, to output an error message instead.
                    else {
                        System.out.println("Error[" + fieldName + "]: " + 
response.getResponseCode(fieldName).name());
                    }
                }
                System.out.println("done");
            }
            Thread.sleep(1000);
        }
```

It shows the connection is not cleaned properly. 

I see it's more efficient to do this using long tcp connection (reuse 1 
connection or use a pool). But short tcp connection should also work.
 



--
This message was sent by Atlassian Jira
(v8.20.7#820007)

Reply via email to