[
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)