You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by "Carsten Ziegeler (JIRA)" <ji...@apache.org> on 2018/01/23 21:12:00 UTC

[jira] [Comment Edited] (FELIX-5776) Memory Leak by Config Admin

    [ https://issues.apache.org/jira/browse/FELIX-5776?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16336364#comment-16336364 ] 

Carsten Ziegeler edited comment on FELIX-5776 at 1/23/18 9:11 PM:
------------------------------------------------------------------

I've added a basic test, inspecting the behaviour of deleting factory configs. This looks ok.

Now, if the update thread has still tasks, then this could explain why the memory is not cleaned up, because the update task is actually doing this. The locking wrt factory configurations looks strange and incomplete to me. I'll have a deeper look into that

Just to be sure, are you using custom persistence managers?


was (Author: cziegeler):
I've added a basic test, inspecting the behaviour of deleting factory configs. This looks ok. Are you using custom persistence managers?

> Memory Leak by Config Admin
> ---------------------------
>
>                 Key: FELIX-5776
>                 URL: https://issues.apache.org/jira/browse/FELIX-5776
>             Project: Felix
>          Issue Type: Bug
>          Components: Configuration Admin
>    Affects Versions: configadmin-1.8.16
>            Reporter: Fabian Lange
>            Priority: Major
>         Attachments: Screen Shot 2018-01-22 at 11.26.39.png, Screen Shot 2018-01-22 at 11.28.14.png
>
>
> I have a heapdump (which I cannot share publicly) of a karaf container which crashed due to out of memory.
> The Heapdump shows 30mb occupied by org.apache.felix.cm.impl.CachingPersistenceManagerProxy including several related classes.
> I am going to attach a few screenshots from MAT/JProfiler.
> There are a few threads involved which look interesting.
>  
> {noformat}
>   Thread "CM Configuration Updater (Delete: pid=ce24c1344-88bb-4c66-bebc-527cc574f347)":
>     at sun.misc.Unsafe.park(boolean, long)
>     at java.util.concurrent.locks.LockSupport.park(java.lang.Object) (line: 175)
>     at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt() (line: 836)
>     at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(java.util.concurrent.locks.AbstractQueuedSynchronizer$Node, int) (line: 870)
>     at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(int) (line: 1199)
>     at java.util.concurrent.locks.ReentrantReadWriteLock$WriteLock.lock() (line: 943)
>     at org.apache.felix.cm.impl.CachingPersistenceManagerProxy.store(java.lang.String, java.util.Dictionary) (line: 245)
>     at org.apache.felix.cm.impl.Factory.store() (line: 137)
>     at org.apache.felix.cm.impl.ConfigurationManager$DeleteConfiguration.run() (line: 1876)
>     at org.apache.felix.cm.impl.UpdateThread.run0(java.lang.Runnable) (line: 141)
>     at org.apache.felix.cm.impl.UpdateThread.run() (line: 109)
>     at java.lang.Thread.run() (line: 748)
>   Thread "updater-thread-1":
>     at sun.misc.Unsafe.park(boolean, long)
>     at java.util.concurrent.locks.LockSupport.park(java.lang.Object) (line: 175)
>     at java.util.concurrent.FutureTask.awaitDone(boolean, long) (line: 429)
>     at java.util.concurrent.FutureTask.get() (line: 191)
>     at org.apache.karaf.features.internal.service.FeaturesServiceImpl.doProvisionInThread(java.util.Map, java.util.Map, org.apache.karaf.features.internal.service.State, java.util.EnumSet) (line: 1134)
>     at org.apache.karaf.features.internal.service.FeaturesServiceImpl.addRequirements(java.util.Map, java.util.EnumSet) (line: 1077)
>   Thread "features-1-thread-1":
>     at sun.misc.Unsafe.park(boolean, long)
>     at java.util.concurrent.locks.LockSupport.park(java.lang.Object) (line: 175)
>     at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt() (line: 836)
>     at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireShared(int) (line: 967)
>     at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireShared(int) (line: 1283)
>     at java.util.concurrent.locks.ReentrantReadWriteLock$ReadLock.lock() (line: 727)
>     at org.apache.felix.cm.impl.CachingPersistenceManagerProxy.getDictionaries(org.apache.felix.cm.impl.SimpleFilter) (line: 137)
>     at org.apache.felix.cm.impl.ConfigurationManager.listConfigurations(org.apache.felix.cm.impl.ConfigurationAdminImpl, java.lang.String) (line: 660)
>     at org.apache.felix.cm.impl.ConfigurationAdminImpl.listConfigurations(java.lang.String) (line: 190)
>     at org.apache.felix.scr.impl.manager.RegionConfigurationSupport.findConfigurations(org.osgi.service.cm.ConfigurationAdmin, java.lang.String) (line: 605)
>     at org.apache.felix.scr.impl.manager.RegionConfigurationSupport.findFactoryConfigurations(org.osgi.service.cm.ConfigurationAdmin, java.lang.String, org.osgi.framework.Bundle) (line: 540)
>     at org.apache.felix.scr.impl.manager.RegionConfigurationSupport.configureComponentHolder(org.apache.felix.scr.impl.manager.ComponentHolder) (line: 143)
>     at org.apache.felix.scr.impl.BundleComponentActivator.setRegionConfigurationSupport(org.osgi.framework.ServiceReference) (line: 833)
>     at org.apache.felix.scr.impl.helper.ConfigAdminTracker$1.addingService(org.osgi.framework.ServiceReference) (line: 71)
>     at org.apache.felix.scr.impl.helper.ConfigAdminTracker$1.addingService(org.osgi.framework.ServiceReference) (line: 43)
>     at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(org.osgi.framework.ServiceReference, org.osgi.framework.ServiceEvent) (line: 941)
>     at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(java.lang.Object, java.lang.Object) (line: 870)
>     at org.osgi.util.tracker.AbstractTracked.trackAdding(java.lang.Object, java.lang.Object) (line: 256)
>     at org.osgi.util.tracker.AbstractTracked.trackInitial() (line: 183)
>     at org.osgi.util.tracker.ServiceTracker.open(boolean) (line: 318)
>     at org.osgi.util.tracker.ServiceTracker.open() (line: 261)
>     at org.apache.felix.scr.impl.helper.ConfigAdminTracker.<init>(org.apache.felix.scr.impl.manager.ComponentActivator) (line: 88)
>     at org.apache.felix.scr.impl.BundleComponentActivator.<init>(org.apache.felix.scr.impl.helper.SimpleLogger, org.apache.felix.scr.impl.ComponentRegistry, org.apache.felix.scr.impl.ComponentActorThread, org.osgi.framework.BundleContext, org.apache.felix.scr.impl.manager.ScrConfiguration) (line: 274)
>     at org.apache.felix.scr.impl.Activator.loadComponents(org.osgi.framework.Bundle) (line: 388)
>     at org.apache.felix.scr.impl.Activator.access$200(org.apache.felix.scr.impl.Activator, org.osgi.framework.Bundle) (line: 54)
>     at org.apache.felix.scr.impl.Activator$ScrExtension.start() (line: 265)
>     at org.apache.felix.utils.extender.AbstractExtender.createExtension(org.osgi.framework.Bundle) (line: 254)
>     at org.apache.felix.utils.extender.AbstractExtender.modifiedBundle(org.osgi.framework.Bundle, org.osgi.framework.BundleEvent, java.lang.Object) (line: 227)
>     at org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(org.osgi.framework.Bundle, org.osgi.framework.BundleEvent, java.lang.Object) (line: 482)
>     at org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(java.lang.Object, java.lang.Object, java.lang.Object) (line: 415)
>     at org.osgi.util.tracker.AbstractTracked.track(java.lang.Object, java.lang.Object) (line: 232)
>     at org.osgi.util.tracker.BundleTracker$Tracked.bundleChanged(org.osgi.framework.BundleEvent) (line: 444)
>     at org.apache.felix.framework.EventDispatcher.invokeBundleListenerCallback(org.osgi.framework.Bundle, java.util.EventListener, java.util.EventObject) (line: 915)
>     at org.apache.felix.framework.EventDispatcher.fireEventImmediately(org.apache.felix.framework.EventDispatcher, int, java.util.Map, java.util.EventObject, java.util.Dictionary) (line: 834)
>     at org.apache.felix.framework.EventDispatcher.fireBundleEvent(org.osgi.framework.BundleEvent, org.apache.felix.framework.Felix) (line: 516)
>     at org.apache.felix.framework.Felix.fireBundleEvent(int, org.osgi.framework.Bundle) (line: 4563)
>     at org.apache.felix.framework.Felix.startBundle(org.apache.felix.framework.BundleImpl, int) (line: 2173)
>     at org.apache.felix.framework.BundleImpl.start(int) (line: 998)
>     at org.apache.felix.framework.BundleImpl.start() (line: 984)
>     at org.apache.karaf.features.internal.service.FeaturesServiceImpl.startBundle(org.osgi.framework.Bundle) (line: 1346)
>     at org.apache.karaf.features.internal.service.Deployer.deploy(org.apache.karaf.features.internal.service.Deployer$DeploymentState, org.apache.karaf.features.internal.service.Deployer$DeploymentRequest) (line: 891)
>     at org.apache.karaf.features.internal.service.FeaturesServiceImpl.doProvision(java.util.Map, java.util.Map, org.apache.karaf.features.internal.service.State, java.util.EnumSet, java.lang.String) (line: 1233)
>     at org.apache.karaf.features.internal.service.FeaturesServiceImpl.lambda$doProvisionInThread$0(java.util.Map, java.util.Map, org.apache.karaf.features.internal.service.State, java.util.EnumSet, java.lang.String) (line: 1132)
>     at org.apache.karaf.features.internal.service.FeaturesServiceImpl$$Lambda$16.call()
>     at java.util.concurrent.FutureTask.run() (line: 266)
>     at java.util.concurrent.ThreadPoolExecutor.runWorker(java.util.concurrent.ThreadPoolExecutor$Worker) (line: 1142)
>     at java.util.concurrent.ThreadPoolExecutor$Worker.run() (line: 617)
>     at java.lang.Thread.run() (line: 748)
> {noformat}
>  
> This might as well be a karaf bug.
> While it looks like a memory leak, I could also suspect that this might be cause by a concurrency problem, as the threadump shows multiple updating threads.
> I can provide more details if required, or share the dump privately.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)