[ 
https://issues.apache.org/jira/browse/PLC4X-339?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17528600#comment-17528600
 ] 

Christofer Dutz commented on PLC4X-339:
---------------------------------------

This behaviour has been observed quite often before. However we currently 
haven't found the solution yet. So if you happen to continue searching and 
actually find the reason in the end, this would be super awesome.  But before 
investing too much time ... please make sure it's not already fixed on the 
current SNAPSHOT version. 

> 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
>            Priority: Major
>
> 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