I uploaded it to a private repo in my github account. I send you an invitation.
Please confirm me if you received the invitation. Thank you Riccardo From: Justin Bertram <[email protected]> Date: Wednesday, 17 September 2025 at 16:13 To: [email protected] <[email protected]> Subject: Re: How to programmatically delete addresses in Artemis I recommend you upload it to a Git repo somewhere (e.g. GitHub, GitLab, BitBucket, Codeberg, etc.). Justin On Wed, Sep 17, 2025 at 2:49 AM Modanese, Riccardo <[email protected]> wrote: > Hi Justin, I have built a small project to reproduce the issue. > > There is a readme file, in the root directory, with the instructions to > build and run the test. > > How can you provide the code? (it’s composed by few maven projects) > > Riccardo > > From: Modanese, Riccardo <[email protected]> > Date: Monday, 15 September 2025 at 09:33 > To: [email protected] <[email protected]> > Subject: Re: How to programmatically delete addresses in Artemis > I’m still working to isolate the code. > > About the auto deletion, we have different subscriptions made MQTT and > AMQP clients (we had a custom plugin with ActiveMQ classic also). > > > Not clear why but, with the same address-settings configuration, if I > disable our plugin the addresses are not deleted. > > If I remember correctly, the addresses are removed only once the MQTT > devices are disconnected. We did several attempts to find the way to get > them deleted but, when we got it, we had also durable subscriptions from > AMQP clients deleted once AMQP clients were disconnected. > > > > About possible memory leak, I can estimate a couple of hundred Mb for 1 > million deleted addresses. > > > > Hope to be back with a test case. > > > > Riccardo > > From: Justin Bertram <[email protected]> > Date: Sunday, 14 September 2025 at 06:14 > To: [email protected] <[email protected]> > Subject: Re: How to programmatically delete addresses in Artemis > If there was some kind of memory leak during the process of removing an > address I would expect there to be lots of reports from users because it's > a pretty common operation during the life of a broker. This is why I'm keen > on getting clear details and hard facts. > > Regarding your MQTT use-case, it's not clear to me why the broker can't > handle it out-of-the-box. Why specifically do you need a plugin? > > There's a few things to note regarding the methods you've mentioned here. > First, the clearAddressCache method on ActiveMQServer is already invoked > when the address is removed via the methods we've discussed previously. > Second, message counters [1] are not enabled by default so > invoking resetAllMessageCounterHistories or resetAllMessageCounters > shouldn't be necessary unless you've specifically enabled message counters > in your configuration. Have you, in fact, enabled message counters in your > configuration? > > I look forward to your test-case. > > > Justin > > [1] > > https://activemq.apache.org/components/artemis/documentation/latest/management.html#message-counters > > On Fri, Sep 12, 2025 at 10:56 AM Modanese, Riccardo > <[email protected]> wrote: > > > About > > “The answer to the question I posed in my first response (and repeated in > > my > > second) still isn't clear to me. You originally said that it, "...looks > > like there are addresses related objects not removed from the broker > > memory..." Can you elaborate on exactly what those "related objects" > are?” > > > > I mean, since the Heap memory grows constantly, I suppose there are > > objects not deallocated that I suppose are related to the address and/or > > the delete operation. But I have no real infos, just my thoughts. > > > > Just to better describe our use case, our clients are sending messages to > > topics used only one time, so every message is published to a new topic > > (like prefix/client-id/timestamp) (MQTT qos ) > > If we force the publish to use only one fixed topic per client (like > > prefix/client-id/topic), the memory doesn’t grow. > > > > I’m working to extract a use case to test. > > > > I did a lot of attempts to isolate the issue but unfortunately without > any > > progress. > > I tuned various GC’s parameters, disabled the broker persistence, the > > address-related metrics export, forced the address cache clean and > message > > count after each address deletion iteration like > > server.clearAddressCache(); > > server.getActiveMQServerControl().resetAllMessageCounterHistories(); > > server.getActiveMQServerControl().resetAllMessageCounters(); > > > > but, even if the memory usage is lower and it takes more time to reach > the > > Out Of Memory, the OOM is reached anyway. > > > > I connected a profiler, and from my understanding of the object > allocation > > flame graph, the memory allocated by the > > server.getActiveMQServerControl().deleteAddress(address, true); > > calls grows. > > > > Unfortunately, looks like there are only a lot of String[] and byte[] > > objects instantiated. So not too much helpful to investigate the possible > > issue. > > > > I hope to be able to isolate soon a use case to reproduce my test. > > > > Riccardo > > > > From: Justin Bertram <[email protected]> > > Date: Wednesday, 10 September 2025 at 19:33 > > To: [email protected] <[email protected]> > > Subject: Re: How to programmatically delete addresses in Artemis > > Are you running the same load in both test-cases? If so, even if the > > addresses weren't being deleted properly in the 2nd test I wouldn't > expect > > the broker to use _more_ memory than the first test. At the very worst it > > should just use the _same_ amount of memory as the first test where the > > addresses are not deleted, right?. Am I missing something? > > > > In any case, have you gathered heap dumps and analyzed them to see what > the > > difference is between the two test-cases? If so, what did you find? > > > > The proper method to use is, in fact, > > o.a.a.a.c.s.ActiveMQServer#removeAddressInfo(SimpleString, SecurityAuth, > > boolean). > > > > The deleteAddress method on the ActiveMQServerControl is essentially > just a > > wrapper around the aforementioned removeAddressInfo method which is > exposed > > for remote management. > > > > The unregisterAddress method on the ManagementService simply removes the > > management & metrics resources corresponding to the address, but it > doesn't > > delete the address itself. > > > > The removeAddressInfo on the PostOffice does a lot of the heavy lifting > > related to removing the address, but it doesn't delete the address > binding > > from storage or remove any pages stored on disk. > > > > Ultimately, removeAddressInfo on ActiveMQServer will > > invoke removeAddressInfo on the PostOffice which, in turn, will invoke > > unregisterAddress method on the ManagementService so there's no need to > > call these yourself. It's no surprise that invoking all these methods in > > various orders might generate an exception at some point. > > > > The answer to the question I posed in my first response (and repeated in > my > > second) still isn't clear to me. You originally said that it, "...looks > > like there are addresses related objects not removed from the broker > > memory..." Can you elaborate on exactly what those "related objects" are? > > > > If you have a test-case you can share that would be helpful as well. > > > > > > Justin > > > > On Wed, Sep 10, 2025 at 11:33 AM Modanese, Riccardo > > <[email protected]> wrote: > > > > > To satisfy our specific logic we have our own address deletion plugin. > > > In any case we have the section [1] you mentioned correctly set in our > > > broker.xml. > > > > > > I try to explain myself in another way. > > > We saw a possible memory leak in our tests, so we created 2 test cases > to > > > try to reproduce this issue. > > > In the first one our plugin doesn’t delete addresses (logic tells the > > > addresses are not to be deleted). The broker heap memory remains more > or > > > less constant. > > > In the second scenario there are a lot of random addresses that are > > > deleted by our plugin. In this scenario the broker heap memory grows > > > constantly, and the broker goes Out Of Memory. I added a task that > > > periodically prints the memory reported by the jvm but we also use the > > > Artemis core metrics to verify the memory growth. > > > > > > I was investigating available methods to delete addresses, and I found > 4 > > > different way that look to me similar. > > > Have no idea about which is the difference, I was looking for > > > documentation, but I didn’t find it. > > > > > > server.removeAddressInfo(simpleAddress, null, true); > > > server.getActiveMQServerControl().deleteAddress(address, true); > > > server.getManagementService().unregisterAddress(simpleAddress); > > > server.getPostOffice().removeAddressInfo(simpleAddress, true); > > > > > > > > > I played with these methods, and I found a call sequence order that > > throws > > > exception (something like not existing address exception). So I’m > wonder > > if > > > our delete is calling the wrong method. > > > > > > Riccardo > > > > > > > > > > > > From: Justin Bertram <[email protected]> > > > Date: Wednesday, 10 September 2025 at 16:49 > > > To: [email protected] <[email protected]> > > > Subject: Re: How to programmatically delete addresses in Artemis > > > If an MQTT client sends messages to an address and that address never > has > > > any queue created on it then it will not be automatically deleted by > > > default since the broker will not consider that address to be "used." > > That > > > may be what is happening in your MQTT "case A." If so, check out > > > the auto-delete-addresses-skip-usage-check [1] address setting. > > > > > > I'm not sure what you mean by "no memory eating" and "memory eating" in > > > this context. Every AddressInfo object consumes memory simply due to > its > > > existence. > > > > > > As far as I can tell, you're deleting the address in the proper way. > > > However, you said that it, "...looks like there are addresses related > > > objects not removed from the broker memory..." and it's not clear what > > > those "related objects" are. Can you elaborate on this? > > > > > > > > > Justin > > > > > > [1] > > > > > > > > > https://activemq.apache.org/components/artemis/documentation/latest/address-settings.html#address-settings > > > > > > On Wed, Sep 10, 2025 at 2:37 AM Modanese, Riccardo > > > <[email protected]> wrote: > > > > > > > Hi Justin, > > > > it’ just a thought from my findings. > > > > Same system setup. > > > > Case A) MQTT clients publishing on topics that create addresses that > > are > > > > not deleted => no memory eating on broker side > > > > Case B) MQTT clients publishing on different topics (every message is > > > > published on a new different topic). These addresses are deleted => > > > memory > > > > eating on broker side > > > > From my checks the address looks to be deleted correctly (Artemis > core > > > > metrics reports a constant address count). > > > > > > > > So I’m wonder if I’m doing address deletion in the right way or I’m > > > > forgetting something. > > > > > > > > Thanks for your support, > > > > Riccardo > > > > > > > > From: Justin Bertram <[email protected]> > > > > Date: Tuesday, 9 September 2025 at 18:39 > > > > To: [email protected] <[email protected]> > > > > Subject: Re: How to programmatically delete addresses in Artemis > > > > Can you elaborate on the "related objects" here? What exactly isn't > > being > > > > removed? > > > > > > > > > > > > Justin > > > > > > > > On Tue, Sep 9, 2025 at 11:17 AM Modanese, Riccardo > > > > <[email protected]> wrote: > > > > > > > > > Hi guys, I have to delete programmatically addresses based on some > > > logic > > > > > in Artemis broker. > > > > > > > > > > I tried with > > > > > SimpleString address = new SimpleString(someStringAddress); > > > > > ... > > > > > ActiveMQServer server = <current_instance>; > > > > > ... > > > > > server.removeAddressInfo(simpleAddress, null, true); > > > > > > > > > > but looks like there are addresses related objects not removed from > > the > > > > > broker memory (there is a memory leak) > > > > > > > > > > Thanks in advance for your support. > > > > > > > > > > Regards, > > > > > Riccardo Modanese > > > > > > > > > > > > > > >
