Rule execution lags, possibly Java GC

Ok… theres a fair few settings I could try out there :slight_smile:

Ill try out the AdoptOpenJDK though first. Ill keep the settings vanilla and then maybe try XMM and XMS additions and see if that gives any different results from the Zulu Java.

Ill give it a few days run and let you know.

FWIW, we’ve just added Zulu 11 and Adopt 11 as java options to openhabian.
Update when openhabian-config asks you to (stay on master) to find it in menu 40.

Hi… Sorry I thought I replied last week to you, but obviously I didnt! (It was a very busy week for me mind).

Adopt OpenJDK seems to run ok. Still the occasional delays, but nothing worse. Im guessing that Openhab has now been made functional with Java 11? (It didnt used to be as I recall?)

Im happy to swap again and give that a shot… see how it goes!

Hope you’re keeping well.

Thanks

Well that’s to be found out. Anything to require a serial interface is said to be problematic, still.

Hi

Hope you are keeping well. So Ive been trying out Zulu 11… It seems to be running ok on my setup. There are still occasional delays here and there, but overall I think its being a much better experience than v8 and the delays seem much fewer/far between… I guess its memory management is better in whatever way. At this time Im only running it with XMS and XMX settings, similar to what we have listed before.

For me at least, Id say that this has resolved my initial complaints to a satisfactory or more than satisfactory level… meaning I would never have raised any issues about delays, were my system running this well on v8.

I dont however have anything serial to test that side of things with… so I cant provide feedback there.

If other people get similar results to myself and there is no other major gotchas with going up to v11, Id say the upgrade is very worthwhile.

Thanks

Exactly what I do (Zulu 11, too, with no special -XX: options but Xmx/Xms only).
And yes, I, too, feel my (few) delays are minimized or gone. It’s just a feeling, however. I don’t have any tests or measurements to support that statement.

The test-drive is to find out about compatibility of Java 11 with OH 2.5 rather than about Java tuning, but if it helps, why not :slight_smile: Status of findings see over there.

@ewrw @mstormi hello I expirenced the same issue and I am using raspberry pi 4 with 4gb with openhabian how can I solve this issue???

@milo

To to summarize, you’re getting a delay on actions/rules processing…not just on the 1st time a rule runs, but intermittently after the rule hasnt been run e.g. the system has been booted for 24+ hours… the rule you are experiencing the delay with HAS been run before in that 24 hours… but now its being slow/delayed again?

If thats what you’re experiencing, obviously there are a ton of variables involved e.g. have you a massive rule-set etc… but for the purposes of this reply, Ill just assume theres nothing too special going on… that your device doesnt have a lack of memory or is busy doing much more than running Openhab… But those are things you would need to consider.

The seeming root cause with my setup was Azul Java v8 not having enough memory given to it to keep all my rules stored in memory… so this would result in garbage collection occurring … which means the rule is removed from memory and has to be loaded from disk again (causing the delay).

In my case, the rules would be removed from memory because either:

  • Java didnt have enough memory to store all rules being used, so had to swap them in/out of memory.
  • They rule in question just hadnt been used in a long time so was dropped out of memory for memory management purposes.
  • Java v8 wasnt as good at memory management as later versions of Java seemingly are.

So… Things you can try:

  • Currently, at the bottom of this long post, you can see we are testing later versions of Java (v11) which Marcus is involved in the testing/approval process of that. So you could try out a later version too (instructions are a few posts up from this one). Please remember though, this is a test, so you could experience other issues.

  • Use the XMX and XMS settings to increase your java memory available. You could also use this with the Java 11. Certainly this is what I am doing and things seem to be better for me. It may provide you some improvement with Java v8. Suggested settings are in the above posts as well as how to implement it (just a quick edit of a config file).

  • There are other settings which are listed in the above posts, and you edit the same configuration file, these basically alter the way that Java Garbage collection works… and I did have some successes with these. I at least reached a satisfactory state with Java v8… though I am now on testing Java v11 because its (in my view) just a better version of Java… and it seems to be working better at this time.

You will always get the initial delay on a reboot where the rules are loaded for the 1st time, but after that, things should be smoother.

My recommendation overall, would be to check you have spare memory and your system isnt overloaded with other things taking cpu/memory…and if all looks good there, Id suggest change the EXTRA_JAVA_OPTS settings to add your XMX and XMS settings to something like 400 800 (look at the above posts for the my settings)… try that on Java v8.

If that doesnt relieve things and you dont have any other issues with trying it, Id go to Java v11 and keep in the XMX and XMS settings and feed back to Marcus if you still have problems.

EDIT: Just adding this to the post
EXTRA_JAVA_OPTS in the /etc/default/openhab2 file.

EXTRA_JAVA_OPTS="-Xms400m -Xmx800m"

Something like the above is quite a lot of memory to give Openhab on a small setup (in my view)… but it might be a good place to start testing and probably work your way in 50MB chunks if it resolves things e.g. -Xms350m -Xmx750m etc… If the 400 and 800 have no impact… def try the Java v11 with these settings… otherwise, assuming no other cpu/memory issues… youre looking at adding other Garbage collection settings and checking there are no issues in your rules.

Thats my thoughts at least.

Thanks

Thanks @ewrw for your summary

This is what I experienced Problems with item changed and-received-update - #12 by rossko57

After some hours not using a rule it is delayed by 20s. And I only run openhab on it…there are some posts here with the same issue faced…I will link your post to them

@milo

Certainly my rules did always run, but the 20 second delay is very much the reason I started off my post and investigation.

As you noted in your other post, your MQTT messages are arriving… so if its an intermittent 20 second delay kind of problem you’re experiencing, then yes, the stuff Ive said above should work or be the right direction to look at.

If on the other hand, the MQTT messages arrive (according to openhab AND mosquito logs), but its a rule not being processed at all, even after 20+ seconds… then my guess would be a problem with the rule in question OR overlapping rules competing with each other OR not enough threads available to process it (though I think not enough threads would cause a further delay than nothing processed at all). You can bump the thread count up though if you need in the Openhab settings files somewhere.

It could even be that other rules are tying up all your threads if those rules have issues within them. (just trying to give you other ideas if you get nowhere with the Java changes).

I think 10-15 threads is/was the standard setting… but dont quote me on that… and obviously smaller processors will only handle so much… but you could always bump it up 5-10 more threads without much issue IF youre convinced that was a problem and your system is running a heavier workload rules wise. (Im not claiming to be an expert at that area, so this is more my own previous research/experience and there may be much better info from other forum posts).

Hopefully the Java bits fixes it though… it may take you a few days of changing a setting, seeing how that goes, changing another setting, see how that goes etc. It took me a couple of weeks testing individual changes with Java v8 and different settings.

Best method… make your config change… reboot your server… make the rule you have a problem with run once after the reboot so its loaded into memory… then leave it 6-8 hours or overnight… test your rule again and see if it has the delay. Id always expect the occasional delay to occur from time to time… but not repeatably/frequently e.g. every morning after sleep the rules are all delayed again, which is what I was experiencing.

Hope you manage to figure it!! :slight_smile:

@ewrw yes the rule is handled correctly after using it once only the first start after 2h not using there is the delay…

I will check and report back

@ewrw is there a way to see the heap used and if there is not much of the heap left?

Hi Milo

Sorry for the late reply… I couldnt pick up my emails for a few days, so only just seen this.

I think on the Extra Java Options you need to add:

-Xloggc:<file>

Detailed here:

This logs out your Java memory settings… though, Marcus was looking through those logs for me to figure what was going on, so I cant tell you what to look for in the files themselves.

Thanks

@milo First thing you should do is find out where the delay is happening.
Insert debug statements into your rule(s) that run with a delay or enable debug level for scripts
(if you log using logDebug("tag", "debug XXX"), use log:set debug org.eclipse.smarthome.model.script.tag in Karaf console).

Compare these with events.log

also remember to correctly set an RPI’s date, it has no RTC.

Hello and how do I display now this debug entry?

It appears as a line in openhab.log.

Got it…

What is seen is

2020-06-26 06:00:51.992 [vent.ItemStateChangedEvent] - string_button_statejson changed from {"event":"p[6].b[4].val", "value":0} to {"event":"p[6].b[4]", "value":"ON"}

2020-06-26 06:00:51.994 [vent.ItemStateChangedEvent] - string_button_statejsonvalue changed from 0 to ON

2020-06-26 06:00:51.994 rule exexuted

If I wait for ~1h doing nothing

It looks like


2020-06-26 07:00:51.992 [vent.ItemStateChangedEvent] - string_button_statejson changed from {"event":"p[6].b[4].val", "value":0} to {"event":"p[6].b[4]", "value":"ON"}

2020-06-26 07:00:51.994 [vent.ItemStateChangedEvent] - string_button_statejsonvalue changed from 0 to ON
2020-06-26 07:01:21.994 rule exexuted

And after it runs ones it will come up directly

That’s curious, a 30 second delay, exact to the millisecond.

A better one:

2020-06-26 15:57:43.163 [vent.ItemStateChangedEvent] - string_haspplate01_statejson changed from {"event":"p[8].b[4].val", "value":"0"} to {"event":"p[8].b[4]", "value":"ON"}
2020-06-26 15:57:43.165 [vent.ItemStateChangedEvent] - string_haspplate01_statejsonvalue changed from 0 to ON
2020-06-26 15:58:30.435 [DEBUG] [.eclipse.smarthome.model.script.HASP] - debug else path

and after this

2020-06-26 15:58:56.790 [vent.ItemStateChangedEvent] - string_haspplate01_statejson changed from {"event":"p[8].b[4].val", "value":"0"} to {"event":"p[8].b[4]", "value":"ON"}

2020-06-26 15:58:56.791 [vent.ItemStateChangedEvent] - string_haspplate01_statejsonvalue changed from 0 to ON
2020-06-26 15:58:56.796 [DEBUG] [.eclipse.smarthome.model.script.HASP] - debug else path

The rule

rule "handle HASP plate01"
when
    Item string_haspplate01_statejsonvalue received update /*or 
    Item switch_haspplate01_motion changed*/
then
    try{
        logInfo ("Handle HASP", "triggered" + string_haspplate01_statejsonvalue.state.toString)
        //parse out data from JSON string (page, button, value)
        logDebug("HASP", "debug start")
            //var String eventbutton = string_haspplate01_statejso"nevent.state.toString.split("\\[").get(2).split("\\]").get(0)
        
        if (string_haspplate01_statejsonvalue.state == '0')
        {
            //Do nothing (button release event)
            logInfo ("HASP", "Ignoring OFF event")
        }
        else
        {   
            logDebug("HASP", "debug else path")
            logInfo ("HASP", "ON event ")
            var String local_statejsonevent = string_haspplate01_statejsonevent.state.toString
            val String eventpage = local_statejsonevent.split("\\[").get(1).split("\\]").get(0)
            val String eventbutton = local_statejsonevent.split("\\[").get(2).split("\\]").get(0)
            //Handle Page/button/dimmer value event
            if(switch_haspplate01_light.state == OFF)
            {
                switch_haspplate01_light.sendCommand(ON)
            }
            if ((eventbutton == '1' || eventbutton == '2' || eventbutton == '3') && eventpage != '0')
            {
                switch(eventbutton)
                    {
                        case '1':
                        {
                            number_haspplate01_page.sendCommand(globalvar_number_plate01_pagebutton1page)
                        }
                        case '2':
                        {
                            number_haspplate01_page.sendCommand(globalvar_number_plate01_pagebutton2page)
                        }
                        case '3':
                        {
                            number_haspplate01_page.sendCommand(globalvar_number_plate01_pagebutton3page)
                        }
                    }               
                    switch_haspplate01_light.sendCommand(ON) //refresh backlight timer following button press
            }
            else
            {
                switch(eventpage)
                {
                    case '2':
                    {
                        if (eventbutton == '4')
                        {   //Insert action to perform if button 4 was pressed
                                
                            switch switch_Master.state
                            {
                                case ON:
                                {
                                    globalvar_string_plate01_jsonstring = '["p[2].b[4].bco=65535"]'
                                    switch_Master.sendCommand(OFF)
                                }
                                case OFF:   
                                {
                                    globalvar_string_plate01_jsonstring = '["p[2].b[4].bco=25388"]'
                                    switch_Master.sendCommand(ON)
                                }     
                            }
                            string_haspplate01_commandjson.sendCommand(globalvar_string_plate01_jsonstring)
                        }
                        else if (eventbutton == '5')
                        {   //Insert action to perform if button 4 was pressed
                            
                            if ( number_openhab2operatingmodus_specialmode.state == 2)
                            {
                                globalvar_number_openhab2operatingmodus_specialmode = 0
                            }
                            else if (number_openhab2operatingmodus_specialmode.state != NULL && number_openhab2operatingmodus_specialmode.state != UNDEF) 
                            {
                                globalvar_number_openhab2operatingmodus_specialmode = (number_openhab2operatingmodus_specialmode.state as DecimalType).intValue
                                globalvar_number_openhab2operatingmodus_specialmode = globalvar_number_openhab2operatingmodus_specialmode + 1
                            }
                            else 
                            {
                                globalvar_number_openhab2operatingmodus_specialmode = 0
                            }
                            
                            if (globalvar_number_openhab2operatingmodus_specialmode == 0)
                            {
                                globalvar_string_plate01_jsonstring = '["p[2].b[5].txt=\\"Urlaub\\""]'
                                number_openhab2operatingmodus_specialmode.sendCommand(globalvar_number_openhab2operatingmodus_specialmode)
                            }
                            else if (globalvar_number_openhab2operatingmodus_specialmode == 1)
                            {
                                globalvar_string_plate01_jsonstring = '["p[2].b[5].txt=\\"Alarm\\""]'
                                number_openhab2operatingmodus_specialmode.sendCommand(globalvar_number_openhab2operatingmodus_specialmode)
                            }
                            else if (globalvar_number_openhab2operatingmodus_specialmode == 2)
                            {
                                globalvar_string_plate01_jsonstring = '["p[2].b[5].txt=\\"Alarm Aus\\""]'
                                number_openhab2operatingmodus_specialmode.sendCommand(globalvar_number_openhab2operatingmodus_specialmode)
                            }

                         string_haspplate01_commandjson.sendCommand(globalvar_string_plate01_jsonstring)
                        }
                    }
                    case '6':
                    {
                        if (eventbutton == '4')
                        {   //Insert action to perform if button 4 was pressed
                                
                            switch switch_hueonoffgroup10.state
                            {
                                case ON:
                                {
                                    globalvar_string_plate01_jsonstring = '["p[6].b[4].bco=65535"]'
                                    switch_hueonoffgroup10.sendCommand(OFF)
                                }
                                case OFF:   
                                {
                                    globalvar_string_plate01_jsonstring = '["p[6].b[4].bco=25388"]'
                                    switch_hueonoffgroup10.sendCommand(ON)
                                    number_huescenegroup10.sendCommand(10)
                                    dimmer_hueonoffgroup10.sendCommand(100)
                                }     
                            }
                        }
                        else if (eventbutton == '5')
                        {   //Insert action to perform if button 4 was pressed
                                
                            switch switch_hueonoffgroup3.state
                            {
                                case ON:
                                {
                                    globalvar_string_plate01_jsonstring = '["p[6].b[5].bco=65535"]'
                                    switch_hueonoffgroup3.sendCommand(OFF)
                                }
                                case OFF:   
                                {
                                    globalvar_string_plate01_jsonstring = '["p[6].b[5].bco=25388"]'
                                    switch_hueonoffgroup3.sendCommand(ON)
                                    number_huescenegroup10.sendCommand(10)
                                    dimmer_hueonoffgroup3.sendCommand(100)
                                }     
                            }
                        }
                        string_haspplate01_commandjson.sendCommand(globalvar_string_plate01_jsonstring)
                    }
                    case '7':
                    {
                        /*
                            Act on buttons/dimmers from Page 7 here
                        */
                        if (eventbutton == '4')
                        {
                            if (globalvar_number_plate01_tempdoublepage == 1)
                            {
                                globalvar_number_plate01_tempdoublepage = 11
                            }
                            else 
                            {
                                globalvar_number_plate01_tempdoublepage = 1
                            }
                            
                             //HASP_Plate01_Page_Current.sendCommand(1)
                            //Insert action to perform if button 4 was pressed
                        }
                        else if (eventbutton == '5')
                        {
                            number_haspplate01_pagecurrent.sendCommand(2)
                            //Insert action to perform if button 5 was pressed
                        }
                        else if (eventbutton == '6')
                        {
                            number_haspplate01_pagecurrent.sendCommand(3)
                            //Insert action to perform if button 6 was pressed
                        }
                        else if (eventbutton == '7')
                        {
                            number_haspplate01_pagecurrent.sendCommand(4)
                            //Insert action to perform if button 7 was moved
                        }  
                        else if (eventbutton == '8')
                        {
                            number_haspplate01_pagecurrent.sendCommand(5)
                            //Insert action to perform if button 8 was moved
                        }
                        else if (eventbutton == '9')
                        {
                            number_haspplate01_pagecurrent.sendCommand(6)
                            //Insert action to perform if button 9 was moved
                        }
                        else if (eventbutton == '10')
                        {
                            number_haspplate01_pagecurrent.sendCommand(7)
                            //Insert action to perform if button 10 was moved
                        }
                        else if (eventbutton == '11')
                        {
                            number_haspplate01_pagecurrent.sendCommand(8)
                            //Insert action to perform if button 11 was moved
                        }         
                        else if (eventbutton == '12')
                        {
                            number_haspplate01_pagecurrent.sendCommand(9)
                            //Insert action to perform if button 12 was moved
                        }     
                        else if (eventbutton == '13')
                        {
                           //Insert action to perform if button 13 was moved
                        }  
                        else if (eventbutton == '14')
                        {
                            
                            logInfo("handle HASP plate01 page", globalvar_number_plate01_tempdoublepage.toString())
                            if ( globalvar_number_plate01_tempdoublepage == 1)
                            {
                                globalvar_number_plate01_tempdoublepage = 10
                            }
                            else 
                            {
                               number_haspplate01_pagecurrent.sendCommand(0)
                            }
                            //Insert action to perform if button 14 was moved
                        }  
                        else if (eventbutton == '15')
                        {
                            logInfo("handle HASP plate01 page ", globalvar_number_plate01_tempdoublepage.toString())
                            number_haspplate01_pagecurrent.sendCommand(globalvar_number_plate01_tempdoublepage)
                            globalvar_number_plate01_tempdoublepage = 0
                            //Insert action to perform if button 15 was moved
                        }   
                        switch_haspplate01_light.sendCommand(ON) //refresh backlight timer following button press                     
                    }
                    case '8':
                    {
                        if (eventbutton == '4')
                        {   //Insert action to perform if button 4 was pressed
                                
                            switch switch_hueonoffgroup10.state
                            {
                                case ON:
                                {
                                    globalvar_string_plate01_jsonstring = '["p[8].b[4].bco=65535"]'
                                    switch_hueonoffgroup10.sendCommand(OFF)
                                }
                                case OFF:   
                                {
                                    globalvar_string_plate01_jsonstring = '["p[8].b[4].bco=25388"]'
                                    number_huescenegroup10.sendCommand(10)
                                    switch_hueonoffgroup10.sendCommand(ON)
                                    dimmer_hueonoffgroup3.sendCommand(100)
                                }     
                            }
                            string_haspplate01_commandjson.sendCommand(globalvar_string_plate01_jsonstring)
                        }
                        else if (eventbutton == '5')
                        {
                            if ( number_huescenegroup10.state == 13)
                            {
                                globvar_number_huescenegroup10 = 0
                            }
                            else if (number_huescenegroup10.state != NULL && number_huescenegroup10.state != UNDEF) 
                            {
                                globvar_number_huescenegroup10 = (number_huescenegroup10.state as DecimalType).intValue
                                globvar_number_huescenegroup10 = globvar_number_huescenegroup10 + 1
                            }
                            else 
                            {
                                globvar_number_huescenegroup10 = 0
                            }

                            if (globvar_number_huescenegroup10 == 0)
                            {
                                globalvar_string_plate01_jsonstring = '["p[8].b[5].txt=\\"OFF\\""]'
                                number_huescenegroup10.sendCommand(globvar_number_huescenegroup10)
                            }
                            else if (globvar_number_huescenegroup10 == 1)
                            {
                                globalvar_string_plate01_jsonstring = '["p[8].b[5].txt=\\"ON\\""]'
                                number_huescenegroup10.sendCommand(globvar_number_huescenegroup10)
                            }
                            else if (globvar_number_huescenegroup10 == 2)
                            {
                                globalvar_string_plate01_jsonstring = '["p[8].b[5].txt=\\"Sonnenuntergang Savanne\\""]'
                                number_huescenegroup10.sendCommand(globvar_number_huescenegroup10)
                            }
                            else if (globvar_number_huescenegroup10 == 3)
                            {
                                globalvar_string_plate01_jsonstring = '["p[8].b[5].txt=\\"Tropendämmerung\\""]'
                                number_huescenegroup10.sendCommand(globvar_number_huescenegroup10)
                            }
                            else if (globvar_number_huescenegroup10 == 4)
                            {
                                globalvar_string_plate01_jsonstring = '["p[8].b[5].txt=\\"Nordlichter\\""]'
                                number_huescenegroup10.sendCommand(globvar_number_huescenegroup10)
                            }
                            else if (globvar_number_huescenegroup10 == 5)
                            {
                                globalvar_string_plate01_jsonstring = '["p[8].b[5].txt=\\"Entspannen\\""]'
                                number_huescenegroup10.sendCommand(globvar_number_huescenegroup10)
                            }
                            else if (globvar_number_huescenegroup10 == 6)
                            {
                                globalvar_string_plate01_jsonstring = '["p[8].b[5].txt=\\"Lesen\\""]'
                                number_huescenegroup10.sendCommand(globvar_number_huescenegroup10)
                            }
                            else if (globvar_number_huescenegroup10 == 7)
                            {
                                globalvar_string_plate01_jsonstring = '["p[8].b[5].txt=\\"Frühlingsblüten\\""]'
                                number_huescenegroup10.sendCommand(globvar_number_huescenegroup10)
                            }
                            else if (globvar_number_huescenegroup10 == 8)
                            {
                                globalvar_string_plate01_jsonstring = '["p[8].b[5].txt=\\"Konzentration\\""]'
                                number_huescenegroup10.sendCommand(globvar_number_huescenegroup10)
                            }
                            else if (globvar_number_huescenegroup10 == 9)
                            {
                                globalvar_string_plate01_jsonstring = '["p[8].b[5].txt=\\"Aktivieren\\""]'
                                number_huescenegroup10.sendCommand(globvar_number_huescenegroup10)
                            }
                            else if (globvar_number_huescenegroup10 == 10)
                            {
                                globalvar_string_plate01_jsonstring = '["p[8].b[5].txt=\\"Hell\\""]'
                                number_huescenegroup10.sendCommand(globvar_number_huescenegroup10)
                            }
                            else if (globvar_number_huescenegroup10 == 11)
                            {
                                globalvar_string_plate01_jsonstring = '["p[8].b[5].txt=\\"Gedimmt\\""]'
                                number_huescenegroup10.sendCommand(globvar_number_huescenegroup10)
                            }
                            else if (globvar_number_huescenegroup10 == 12)
                            {
                                globalvar_string_plate01_jsonstring = '["p[8].b[5].txt=\\"Nachtlicht\\""]'
                                number_huescenegroup10.sendCommand(globvar_number_huescenegroup10)
                            }
                            else if (globvar_number_huescenegroup10 == 13)
                            {
                                globalvar_string_plate01_jsonstring = '["p[8].b[5].txt=\\"Auto\\""]'
                                number_huescenegroup10.sendCommand(globvar_number_huescenegroup10)
                            }
                            else 
                            {
                                logInfo("loggerName", "else")
                            }
                            
                        }
                        else if (eventbutton == '6')
                        {
                            if (number_huescenegroup10.state == 12)
                            {
                                globalvar_string_plate01_jsonstring = '["p[8].b[6].bco=65535"]'
                                switch_hueonoffgroup10.sendCommand(OFF)
                                number_huescenegroup10.sendCommand(0)
                            }
                            else 
                            {
                                switch_hueonoffgroup10.sendCommand(ON)
                                globalvar_string_plate01_jsonstring = '["p[8].b[6].bco=25388"]'
                                number_huescenegroup10.sendCommand(12)
                            }                            
                        }
                        else if (eventbutton == '9')
                        {
                            dimmer_hueonoffgroup10.sendCommand(Double.parseDouble(string_haspplate01_statejsonvalue.state.toString()))
                            //logInfo("handle HASP plate01 dimmer_hueonoffgroup10 ", dimmer_hueonoffgroup10.state.toString())
                        }
                        string_haspplate01_commandjson.sendCommand(globalvar_string_plate01_jsonstring)
                    }
                }
            }
        }    
    }
    catch(Throwable T) {
      logError("Error", "Some bad stuff happened in \"handle HASP plate01\": " + T.toString)
    }
    finally {
       
    }
end

These ar my settings running on a 8GB pi

EXTRA_JAVA_OPTS="-Xms2048m -Xmx2048m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:/var/log/openhab2/java.log"

Since the new update/upgrade I have done today on my openhabian no more issues occurs…