Uploaded image for project: 'Apache PLC4X'
  1. Apache PLC4X
  2. PLC4X-339

modbus connection causes memory leak

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Open
    • Major
    • Resolution: Unresolved
    • 0.9.0
    • None
    • Driver-Modbus
    • None
    • Windows 10; jdk1.8 32bit

    Description

      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:

              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.

      Attachments

        Activity

          People

            Unassigned Unassigned
            liangjian liangjian
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

            Dates

              Created:
              Updated: