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

liangjian commented on PLC4X-339:
---------------------------------

I try accessing the seimens PLC simulator via s7 protocol rather than modbus. 
The program does not quit as well. It maybe a general bug.

        try (...) {
                builder.addItem("value-1", "%DB21.DBD0:DINT", 30000);
                builder.addItem("value-2", "%DB21.DBD4:REAL", 3.14);
                PlcWriteRequest writeRequest = builder.build();
                PlcWriteResponse response = writeRequest.execute().get();
                ...
        }
        // NEVER COME HERE

Reproduced on v0.9.1. Not tried on the latest snapshot. Hope it's been fixed.

> 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