Hi everyone,

I work for a company that have been using Felix with Java Web Start in
a core product for several years. Thus, we have recently encountered
the security warning discussed on this mailing list and in the issue
below:

https://issues.apache.org/jira/browse/FELIX-4281

I have been looking into this now and then for the past few weeks, and
I have a small toy-example that reproduces the problem. For a while I
thought we had a problem somewhere in our code, or maybe something was
wrong with Java Web Start (that would not the the first time ...), but
I am beginning to think we're dealing with a bug in Felix. I do not
understand all aspects of the problem, but I have found that removing
a few lines of code from
org/apache/felix/framework/ExtensionManager.java makes the problem go
away:

//            
Felix.m_secureAction.addURLToURLClassLoader(Felix.m_secureAction.createURL(
//                 Felix.m_secureAction.createURL(null, "http:",
extensionManager),
//                 "http://felix.extensions:9/";, extensionManager),
//                 Felix.class.getClassLoader());

The code seems to have something to do with OSGi extension bundles. We
don't use them anyway. Thus, we can live with that fix. However, this
is probably not a solution for everyone.

The code I have removed adds the special "http://felix.extensions:9/";
URL to an URLClassLoader. It seems that this URL causes problems when
Java Web Start performs security checks. I got suspicious about this
when I got the following in my Java Web Start log:

security: JAVAWS AppPolicy Permission requested for: http://felix.extensions:9/
ruleset: finding Deployment Rule Set for
        title: null
        location: null
        main location: http://felix.extensions:9/
        main version: null
        isArtifact: true

The main location does not look like the main location of other jar
files in the log. That made me stumble upon an old issue from 2011
(https://issues.apache.org/jira/browse/FELIX-2780). In the comments
Ingo Bauersachs suggested to replace "http" with some other protocol
descriptor. I have tried to do the same, but it does not remove the
security warnings. However, when I remove the lines as suggested
above, my log looks like this:

Security: JAVAWS AppPolicy Permission requested for:
http://localhost:8000/felix.jar
ruleset: finding Deployment Rule Set for
        title: Webstart Felix
        location: http://localhost:8000/wsf.jnlp
        main location: http://localhost:8000/felix.jar
        main version: null
        isArtifact: true

I have tried looking into
org/apache/felix/framework/util/SecureAction.java to see if I would
somehow come up with a less radical fix. I have failed to do so until
now, but maybe someone with a deeper knowledge of Felix could figure
something out?

My small toy program is a very simple one. It looks like this:

  public static void main(String[] args) throws Exception {

    System.out.println("Bootstrapper running");

    System.out.println("Press '5' to enable more logging in your " +
      "Java Webstart Console (you've got 3 seconds).");

    for(int i = 3; i > 0; i--) {
      Thread.sleep(1000);
      System.out.println(i);
    }

    System.out.println("Starting Felix");
    HashMap<String,String> cfg = new HashMap<String,String>();
    //cfg.put("felix.service.urlhandlers", "false"); // tried this: it
doesn't make a difference.

    Felix f = new Felix(cfg);
    f.init(); // <--- this is where the warning is shown
    f.start();
    f.stop();

    System.out.println("It worked!");
  }

My JNLP file looks like this:

<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+" codebase="http://localhost:8000/"; href="wsf.jnlp">
    <information>
        <title>Webstart Felix</title>
        <vendor>Martin Rytter</vendor>
        <offline-allowed/>
    </information>
    <security>
      <all-permissions />
    </security>
    <resources>
        <j2se version="1.7.0+" href="http://java.sun.com/products/autodl/j2se"/>
        <jar href="wsf.jar" main="true" />
        <jar href="felix.jar" />
    </resources>
    <application-desc name="Webstart Felix" main-class="wsf.Main" />
</jnlp>

I use a JNLP template because this is what we do in our product.
However, signing the plain old JNLP file would probably cause the same
problem. My template looks like this:

<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+" codebase="*" href="*">
    <information>
        <title>*</title>
        <vendor>Martin Rytter</vendor>
        <offline-allowed/>
    </information>
    <security>
      <all-permissions />
    </security>
    <resources>
        <j2se version="1.7.0+" href="http://java.sun.com/products/autodl/j2se"/>
        <jar href="wsf.jar" main="true" />
        <jar href="felix.jar" />
    </resources>
    <application-desc name="*" main-class="wsf.Main" />
</jnlp>

The recent security updates prefer if you add some special entries to
the manifests of all your jar files. Thus, I add the following entries
to the felix.jar and wsf.jar:

Codebase=*
Permissions=all-permissions
Trusted-Only=true

Both my jar files are signed using our company's keystore. I you have
trouble reproducing what I did above, I could remove the keystore from
my example and share it with you. It would probably be possible to do
the same with a self-signed certificate, but I have not tried that
yet.

I discovered the problem when using org.apache.felix.framework-4.0.3,
but I have made my toy-example with the more recent
org.apache.felix.framework-4.2.1. The two versions of Felix seem to
have the same problem.

I have tried to get a deeper understanding of the problem by making a
threaddump when the security warning is shown. I didn't learn a lot
from that, but I suspect someone with deep knowledge of Java Web Start
or Felix would. The threaddump looks like this:

Dump thread stack ...
----------------------------------------------------
2013-10-25 09:01:25
Full thread dump Java HotSpot(TM) 64-Bit Server VM (24.45-b08 mixed mode):

"FelixDispatchQueue" prio=10 tid=0x00007f0924092000 nid=0x14f9 in
Object.wait() [0x00007f099a68b000]
   java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000007ae4ab7e0> (a java.util.ArrayList)
at java.lang.Object.wait(Object.java:503)
at 
org.apache.felix.framework.util.EventDispatcher.run(EventDispatcher.java:1063)
- locked <0x00000007ae4ab7e0> (a java.util.ArrayList)
at 
org.apache.felix.framework.util.EventDispatcher.access$000(EventDispatcher.java:54)
at 
org.apache.felix.framework.util.EventDispatcher$1.run(EventDispatcher.java:101)
at java.lang.Thread.run(Thread.java:744)

"javawsApplicationMain" prio=10 tid=0x00007f09380be000 nid=0x14f8 in
Object.wait() [0x00007f092fb73000]
   java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000007b1c1a5c8> (a java.lang.Object)
at java.lang.Object.wait(Object.java:503)
at com.sun.javaws.ui.JavawsSysRun.delegate(Unknown Source)
- locked <0x00000007b1c1a5c8> (a java.lang.Object)
at com.sun.deploy.util.DeploySysRun.execute(Unknown Source)
at com.sun.deploy.util.DeploySysRun$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.deploy.util.DeploySysRun.executePrivileged(Unknown Source)
at com.sun.deploy.ui.UIFactory.showSSV3Dialog(Unknown Source)
at com.sun.deploy.uitoolkit.impl.awt.ui.UIFactoryImpl.showSSV3Dialog(Unknown
Source)
at com.sun.deploy.security.SandboxSecurity.showUntrustedDialog(Unknown Source)
at com.sun.deploy.security.SandboxSecurity.checkRunUntrusted(Unknown Source)
at com.sun.deploy.security.SandboxSecurity.checkUnsignedSandboxSecurity(Unknown
Source)
- locked <0x00000007ae55f418> (a com.sun.deploy.util.SessionProperties)
at com.sun.deploy.security.SandboxSecurity.isPermissionGranted(Unknown Source)
at com.sun.javaws.security.AppPolicy.grantRestrictedAccess(Unknown Source)
at com.sun.javaws.security.AppPolicy.addPermissions(Unknown Source)
at com.sun.jnlp.JNLPClassLoader.getTrustedCodeSources(Unknown Source)
at com.sun.deploy.security.CPCallbackHandler$ParentCallback.strategy(Unknown
Source)
at 
com.sun.deploy.security.CPCallbackHandler$ParentCallback.openClassPathElement(Unknown
Source)
- locked <0x00000007b1bd2948> (a
com.sun.deploy.security.CPCallbackHandler$ParentCallback)
at com.sun.deploy.security.DeployURLClassPath$UrlLoader.<init>(Unknown Source)
at com.sun.deploy.security.DeployURLClassPath$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.deploy.security.DeployURLClassPath.getLoader(Unknown Source)
at com.sun.deploy.security.DeployURLClassPath.getLoader(Unknown Source)
- locked <0x00000007b1b022c0> (a com.sun.deploy.security.DeployURLClassPath)
at com.sun.deploy.security.DeployURLClassPath.getResource(Unknown Source)
at java.net.URLClassLoader$1.run(URLClassLoader.java:358)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at com.sun.jnlp.JNLPClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
- locked <0x00000007b1b015d0> (a com.sun.jnlp.JNLPClassLoader)
at java.lang.ClassLoader.loadClass(ClassLoader.java:412)
- locked <0x00000007b1b012e0> (a com.sun.jnlp.JNLPClassLoader)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:190)
at 
org.apache.felix.framework.BundleWiringImpl.<clinit>(BundleWiringImpl.java:1316)
at 
org.apache.felix.framework.StatefulResolver.markResolvedRevisions(StatefulResolver.java:938)
at 
org.apache.felix.framework.StatefulResolver.resolve(StatefulResolver.java:427)
at org.apache.felix.framework.Felix.init(Felix.java:684)
at wsf.Main.main(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.sun.javaws.Launcher.executeApplication(Unknown Source)
at com.sun.javaws.Launcher.executeMainClass(Unknown Source)
at com.sun.javaws.Launcher.doLaunchApp(Unknown Source)
at com.sun.javaws.Launcher.run(Unknown Source)
at java.lang.Thread.run(Thread.java:744)

"AWT-EventQueue-2" prio=10 tid=0x00007f093c1ac000 nid=0x14f7 waiting
on condition [0x00007f092f874000]
   java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for  <0x00000007b1b90088> (a
java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at 
java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at java.awt.EventQueue.getNextEvent(EventQueue.java:543)
at 
java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
at 
java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at 
java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

"Keep-Alive-Timer" daemon prio=10 tid=0x00007f09380b0800 nid=0x14f6
waiting on condition [0x00007f092fa76000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at sun.net.www.http.KeepAliveCache.run(KeepAliveCache.java:172)
at java.lang.Thread.run(Thread.java:744)

"Image Fetcher 0" daemon prio=10 tid=0x00007f093c178000 nid=0x14f4 in
Object.wait() [0x00007f092f773000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000007b1b90230> (a java.util.Vector)
at sun.awt.image.ImageFetcher.nextImage(ImageFetcher.java:147)
- locked <0x00000007b1b90230> (a java.util.Vector)
at sun.awt.image.ImageFetcher.fetchloop(ImageFetcher.java:200)
at sun.awt.image.ImageFetcher.run(ImageFetcher.java:169)

"ProgressReporter" daemon prio=10 tid=0x00007f0920003800 nid=0x14f1 in
Object.wait() [0x00007f092f975000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000007b1b902d8> (a java.util.ArrayList)
at com.sun.javaws.progress.PreloaderDelegate$ProgressQueueChecker.run(Unknown
Source)
- locked <0x00000007b1b902d8> (a java.util.ArrayList)
at java.lang.Thread.run(Thread.java:744)

"TimerQueue" daemon prio=10 tid=0x00007f093c15b000 nid=0x14eb waiting
on condition [0x00007f099812a000]
   java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for  <0x00000007b1b90370> (a
java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at 
java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at java.util.concurrent.DelayQueue.take(DelayQueue.java:209)
at javax.swing.TimerQueue.run(TimerQueue.java:171)
at java.lang.Thread.run(Thread.java:744)

"ConsoleTraceListener" daemon prio=10 tid=0x00007f0938008000
nid=0x14ea in Object.wait() [0x00007f099822b000]
   java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000007b1b90460> (a
com.sun.deploy.uitoolkit.ui.ConsoleTraceListener$BoundedStringBuffer)
at java.lang.Object.wait(Object.java:503)
at 
com.sun.deploy.uitoolkit.ui.ConsoleTraceListener$ConsoleWriterThread.run(Unknown
Source)
- locked <0x00000007b1b90460> (a
com.sun.deploy.uitoolkit.ui.ConsoleTraceListener$BoundedStringBuffer)

"AWT-EventQueue-1" prio=10 tid=0x00007f0938006000 nid=0x14e8 waiting
on condition [0x00007f099a586000]
   java.lang.Thread.State: RUNNABLE
at com.sun.deploy.uitoolkit.ui.ConsoleHelper.dumpAllStacksImpl(Native Method)
at com.sun.deploy.uitoolkit.ui.ConsoleHelper.dumpAllStacks(Unknown Source)
at 
com.sun.deploy.uitoolkit.impl.awt.ui.SwingConsoleWindow$3.actionPerformed(Unknown
Source)
at javax.swing.JComponent$ActionStandin.actionPerformed(JComponent.java:3421)
at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1664)
at javax.swing.JComponent.processKeyBinding(JComponent.java:2878)
at javax.swing.KeyboardManager.fireBinding(KeyboardManager.java:307)
at javax.swing.KeyboardManager.fireKeyboardAction(KeyboardManager.java:250)
at 
javax.swing.JComponent.processKeyBindingsForAllComponents(JComponent.java:2970)
at javax.swing.JComponent.processKeyBindings(JComponent.java:2962)
at javax.swing.JComponent.processKeyEvent(JComponent.java:2841)
at java.awt.Component.processEvent(Component.java:6282)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1895)
at 
java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:762)
at 
java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:1027)
at 
java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:899)
at 
java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:727)
at java.awt.Component.dispatchEventImpl(Component.java:4731)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Window.dispatchEventImpl(Window.java:2719)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:694)
at java.awt.EventQueue$3.run(EventQueue.java:692)
at java.security.AccessController.doPrivileged(Native Method)
at 
java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at 
java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:708)
at java.awt.EventQueue$4.run(EventQueue.java:706)
at java.security.AccessController.doPrivileged(Native Method)
at 
java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
at 
java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at 
java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at 
java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:154)
at java.awt.WaitDispatchSupport$2.run(WaitDispatchSupport.java:182)
at java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:221)
at java.security.AccessController.doPrivileged(Native Method)
at java.awt.WaitDispatchSupport.enter(WaitDispatchSupport.java:219)
at java.awt.Dialog.show(Dialog.java:1082)
at java.awt.Component.show(Component.java:1651)
at java.awt.Component.setVisible(Component.java:1603)
at java.awt.Window.setVisible(Window.java:1014)
at java.awt.Dialog.setVisible(Dialog.java:1005)
at com.sun.deploy.ui.DialogHelper.setVisible(Unknown Source)
at com.sun.deploy.ui.DialogTemplate$31.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:241)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:694)
at java.awt.EventQueue$3.run(EventQueue.java:692)
at java.security.AccessController.doPrivileged(Native Method)
at 
java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:703)
at 
java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at 
java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at 
java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

"DestroyJavaVM" prio=10 tid=0x00007f09b400a800 nid=0x14cd waiting on
condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Javaws Secure Thread" daemon prio=10 tid=0x00007f09b42d3000
nid=0x14e6 in Object.wait() [0x00007f099a78c000]
   java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000007ae6730c0> (a java.awt.EventQueue$1AWTInvocationLock)
at java.lang.Object.wait(Object.java:503)
at java.awt.EventQueue.invokeAndWait(EventQueue.java:1266)
- locked <0x00000007ae6730c0> (a java.awt.EventQueue$1AWTInvocationLock)
at java.awt.EventQueue.invokeAndWait(EventQueue.java:1247)
at javax.swing.SwingUtilities.invokeAndWait(SwingUtilities.java:1349)
at com.sun.deploy.ui.DialogTemplate.setVisible(Unknown Source)
at com.sun.deploy.ui.UIFactory$21.execute(Unknown Source)
at com.sun.javaws.ui.JavawsSysRun$SecureThread.doWork(Unknown Source)
at com.sun.javaws.ui.JavawsSysRun$SecureThread.run(Unknown Source)
- locked <0x00000007b1c1a5c8> (a java.lang.Object)

"AWT-EventQueue-0" prio=10 tid=0x00007f09b42d0800 nid=0x14e5 waiting
on condition [0x00007f09a019c000]
   java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for  <0x00000007b1c1a650> (a
java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at 
java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at java.awt.EventQueue.getNextEvent(EventQueue.java:543)
at 
java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
at 
java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at 
java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

"AWT-Shutdown" prio=10 tid=0x00007f09b42cf000 nid=0x14e4 in
Object.wait() [0x00007f09a8152000]
   java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000007b1c1ac40> (a java.lang.Object)
at java.lang.Object.wait(Object.java:503)
at sun.awt.AWTAutoShutdown.run(AWTAutoShutdown.java:287)
- locked <0x00000007b1c1ac40> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:744)

"AWT-XAWT" daemon prio=10 tid=0x00007f09b423c000 nid=0x14e1 runnable
[0x00007f09a97c1000]
   java.lang.Thread.State: RUNNABLE
at sun.awt.X11.XToolkit.waitForEvents(Native Method)
at sun.awt.X11.XToolkit.run(XToolkit.java:627)
at sun.awt.X11.XToolkit.run(XToolkit.java:591)
at java.lang.Thread.run(Thread.java:744)

"Java2D Disposer" daemon prio=10 tid=0x00007f09b421a800 nid=0x14e0 in
Object.wait() [0x00007f09a9cd2000]
   java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000007b1b41440> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
- locked <0x00000007b1b41440> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
at sun.java2d.Disposer.run(Disposer.java:145)
at java.lang.Thread.run(Thread.java:744)

"CacheCleanUpThread" daemon prio=10 tid=0x00007f09b41d2000 nid=0x14df
in Object.wait() [0x00007f09ab486000]
   java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000007b1c59140> (a com.sun.deploy.cache.CleanupThread)
at java.lang.Object.wait(Object.java:503)
at com.sun.deploy.cache.CleanupThread.run(Unknown Source)
- locked <0x00000007b1c59140> (a com.sun.deploy.cache.CleanupThread)

"CacheMemoryCleanUpThread" daemon prio=10 tid=0x00007f09b41ce800
nid=0x14de in Object.wait() [0x00007f09ab587000]
   java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000007b1d13ab8> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
- locked <0x00000007b1d13ab8> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
at com.sun.deploy.cache.MemoryCache$LoadedResourceCleanupThread.run(Unknown
Source)

"MemoryCache-DelayedCleanup" daemon prio=10 tid=0x00007f09b41cd000
nid=0x14dd in Object.wait() [0x00007f09ab688000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000007b1d13b70> (a java.util.TaskQueue)
at java.util.TimerThread.mainLoop(Timer.java:552)
- locked <0x00000007b1d13b70> (a java.util.TaskQueue)
at java.util.TimerThread.run(Timer.java:505)

"traceMsgQueueThread" daemon prio=10 tid=0x00007f09b40c9000 nid=0x14dc
runnable [0x00007f09abccd000]
   java.lang.Thread.State: RUNNABLE
at java.lang.Throwable.getStackTraceElement(Native Method)
at java.lang.System$2.getStackTraceElement(System.java:1201)
at java.util.logging.LogRecord.inferCaller(LogRecord.java:535)
at java.util.logging.LogRecord.getSourceClassName(LogRecord.java:305)
at java.util.logging.XMLFormatter.format(XMLFormatter.java:131)
at java.util.logging.StreamHandler.publish(StreamHandler.java:196)
- locked <0x00000007b1d73e68> (a java.util.logging.FileHandler)
at java.util.logging.FileHandler.publish(FileHandler.java:575)
- locked <0x00000007b1d73e68> (a java.util.logging.FileHandler)
at java.util.logging.Logger.log(Logger.java:610)
at java.util.logging.Logger.doLog(Logger.java:631)
at java.util.logging.Logger.log(Logger.java:654)
at com.sun.deploy.trace.LoggerTraceListener.print(Unknown Source)
at com.sun.deploy.trace.Trace.firePrintlnEvent(Unknown Source)
at com.sun.deploy.trace.Trace.access$200(Unknown Source)
at com.sun.deploy.trace.Trace$TraceMsgQueueChecker.run(Unknown Source)
at java.lang.Thread.run(Thread.java:744)

"Service Thread" daemon prio=10 tid=0x00007f09b4097000 nid=0x14d9
runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread1" daemon prio=10 tid=0x00007f09b4094800 nid=0x14d8
waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" daemon prio=10 tid=0x00007f09b4092000 nid=0x14d7
waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" daemon prio=10 tid=0x00007f09b4087800 nid=0x14d6
runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Finalizer" daemon prio=10 tid=0x00007f09b4070800 nid=0x14d5 in
Object.wait() [0x00007f09b0bfa000]
   java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000007b1b99498> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
- locked <0x00000007b1b99498> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:189)

"Reference Handler" daemon prio=10 tid=0x00007f09b406c800 nid=0x14d4
in Object.wait() [0x00007f09b0cfb000]
   java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000007b1b98ee8> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:503)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)
- locked <0x00000007b1b98ee8> (a java.lang.ref.Reference$Lock)

"VM Thread" prio=10 tid=0x00007f09b406a000 nid=0x14d3 runnable

"GC task thread#0 (ParallelGC)" prio=10 tid=0x00007f09b4020800
nid=0x14ce runnable

"GC task thread#1 (ParallelGC)" prio=10 tid=0x00007f09b4022000
nid=0x14cf runnable

"GC task thread#2 (ParallelGC)" prio=10 tid=0x00007f09b4024000
nid=0x14d0 runnable

"GC task thread#3 (ParallelGC)" prio=10 tid=0x00007f09b4026000
nid=0x14d1 runnable

"VM Periodic Task Thread" prio=10 tid=0x00007f09b40a2000 nid=0x14da
waiting on condition

----------------------------------------------------

This is an issue that is really important to us. I will try to take my
toy-example-solution and integrate it into our real system next week.
We can probably live with that for a while, as we don't use extension
bundles for anything. However, we would much prefer a more correct
solution. Thus, if you need more information from me, I will be happy
share whatever I know. I will also be happy to test any solution the
Felix team might come up with on our system.

Oh, btw. Thanks to everyone on the Felix team. We love your product!

Cheers,

Martin Rytter

-- 
Martin Rytter - http://martin.ryt.dk

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@felix.apache.org
For additional commands, e-mail: users-h...@felix.apache.org

Reply via email to