[ https://issues.apache.org/jira/browse/CAMEL-12969?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Claus Ibsen resolved CAMEL-12969. --------------------------------- Resolution: Fixed Assignee: Claus Ibsen > camel-core-osgi: Slow Memory Leak in OsgiServiceRegistry > -------------------------------------------------------- > > Key: CAMEL-12969 > URL: https://issues.apache.org/jira/browse/CAMEL-12969 > Project: Camel > Issue Type: Bug > Components: camel-osgi > Affects Versions: 2.18.0, 2.19.0, 2.20.0, 2.21.0, 2.22.0, 2.23.0 > Environment: Java 10 > Karaf 4.2.1 > Camel 2.22.0 > Reporter: Bob Paulin > Assignee: Claus Ibsen > Priority: Major > Fix For: 2.21.4, 2.22.3, 2.24.0, 2.23.1 > > Attachments: ServiceReferenceQueueLeak.PNG, > ServiceReferenceQueuePostContextStop.PNG, > ServiceReferenceQueuePreContextStop.PNG, karafCamelContextStop.PNG > > Time Spent: 20m > Remaining Estimate: 0h > > The OsgiServiceRegistry has a slow memory leak in the serviceReferenceQueue. > Currently every time a service is looked up by any method an item is added to > the serviceReferenceQueue. This is required because of OSGi ServiceReference > counting. However left unchecked the system just continues to add > ConcurrentLinkedQueue$Node objects until memory is exhausted. > !ServiceReferenceQueueLeak.PNG! . > > There is also a second problem with how the registry is being managed within > the OsgiDefaultCamelContext. OsgiServiceRegistry is currently extends > LifecycleStrategySupport which is suppose to unload the serviceReferenceQueue > onContextStop. However the registry is never getting added to the > CamelContext to manage the Lifecycle because the overridden createRegistry > method in OsgiDefaultCamelContext is not being called. This is because the > registry is being set in the constructor of OsgiDefaultCamelContext with > {code:java} > super(registry);{code} > this calls the DefaultCamelContext implementation of createRegistry which > does not add the registry to lifecyclemanagement since > {code:java} > OsgiCamelContextHelper.wrapRegistry(this, registry, bundleContext);{code} > is never called. > See serviceReferenceQueue pre context stop > !ServiceReferenceQueuePreContextStop.PNG! > !karafCamelContextStop.PNG! > See serviceReferenceQueue post context stop (still contain objects) > !ServiceReferenceQueuePostContextStop.PNG! > Both issues would have existed for some time but may have gone unnoticed > because the leak was so slow (ConcurrentLinkedQueue$Node takes up very little > memory). It appears the removal of the cache in > https://issues.apache.org/jira/browse/CAMEL-9631 makes the leak occur more > quickly. > > I have a patch that involves reintroducing the cache but with an invalidation > strategy using the OSGi ServiceListener that leverages a single clean up > thread to remain non-blocking. I'm working on an upstream adaptation and > will post a PR for community review. > > -- This message was sent by Atlassian JIRA (v7.6.3#76005)