AppContext issues breaks -XstartOnFirstThread for multithreaded programs on both 6_51 and 7_25

Erik Vanherck Erik.Vanherck at inventivegroup.com
Fri Jun 28 08:27:08 PDT 2013


Nothing really, it was just the simplest test case i came up with. The issue for us is we use swt based apps and even installers all throughout our product suite which do require the parameter and all of them hang at startup. We have one product  which uses the swt_awt bridge as well so we are well aware of the mess there but this is preventing any of the apps to properly work.

As my test case shows even apps which don't go anywhere near awt (or so they think) will end up with hangs, so it won't be long I guess until some eclipse projects will start bumping into the same issue

Sent from my iPhone

On 28 Jun 2013, at 16:52, "Anthony Petrov" <anthony.petrov at oracle.com> wrote:

> Hi Erik,
>
> While this does look like a bug (please file it at http://bugs.sun.com), I have a question. Since this is not a GUI app, why would you run it with -XstartOnFirstThread ? What exactly are you trying to achieve with this command-line switch?
>
> --
> best regards,
> Anthony
>
> On 06/28/2013 04:57 PM, Erik Vanherck wrote:
>> Hi,
>>
>> I wanted to weigh in a bit since although many people are complaining about the AWT/Swing and webstart issues, it goes much further than that. The AppContext can trigger AWT loading from many locations even as simple as java.util.logging or jmx. In my mind I find it extremely suspicious that these low level utility classes should try to do anything with AWT, especially considering server apps.
>>
>> This test program results in a hang in the spawned thread trying to load in one of the 3 places both on Apple java 1.6.0_51 (with and without the Apple 09 hotfix) and Java 1.7.0_25. It runs as normal java applications, no applet or webstart required, no security manager set, Just add -XstartOnFirstThread to the commandline.
>>
>> import java.lang.management.ManagementFactory;
>> import java.util.logging.Logger;
>>
>> import javax.imageio.spi.IIORegistry;
>> import javax.management.MBeanServer;
>>
>> /**
>>  * @author evanherc
>>  */
>> public class AppContextJVMBug {
>>
>> public static void main(String[] args) {
>> try {
>> System.out.println("Launching");
>>
>> final Thread t = new Thread(new Runnable() {
>> public void run() {
>> try {
>> utilLoggingHang();
>> jmxHang();
>> imageioHang();
>> } catch (Throwable t) {
>> t.printStackTrace();
>> }
>> }
>> });
>>
>> t.start();
>> t.join();
>> System.out.println("Finished");
>> } catch (Throwable t) {
>> t.printStackTrace();
>> }
>> }
>>
>> private static void utilLoggingHang() {
>> final Logger l = Logger.getLogger("MyApp");
>> System.out.println("Done obtaining a logger " + l);
>> }
>>
>> private static void jmxHang() {
>> final MBeanServer mb = ManagementFactory.getPlatformMBeanServer();
>> System.out.println("Done getting the platform mbean server " + mb);
>> }
>>
>> private static void imageioHang() {
>> final IIORegistry registry = IIORegistry.getDefaultInstance();
>> System.out.println("Done retrieving image registry " + registry);
>> }
>> }
>>
>>
>>
>> Tested on several Apple Mac OS X 10.8.4 machines.
>> Without JVM arguments : runs fine
>> With -XstartOnFirstThread : hangs
>> With -XstartOnFirstThread and -Djava.awt.headless=true : runs fine
>>
>> Here's actual stack traces from our large product suites. They break for everyone as we run inside Eclipse and as such have to specify -XstartOnFirstThread.
>> I've seen a dozen variants now (there is other classes triggering AppContext as well).
>>
>> "Thread-4" daemon prio=5 tid=7febb49ae800 nid=0x10f2fb000 runnable [10f2f6000]
>>    java.lang.Thread.State: RUNNABLE
>> at java.lang.ClassLoader$NativeLibrary.load(Native Method)
>> at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1827)
>> - locked <7dc02aec0> (a java.util.Vector)
>> - locked <7dc02aee0> (a java.util.Vector)
>> at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1724)
>> at java.lang.Runtime.loadLibrary0(Runtime.java:823)
>> - locked <7dc02cb28> (a java.lang.Runtime)
>> at java.lang.System.loadLibrary(System.java:1045)
>> at sun.security.action.LoadLibraryAction.run(LoadLibraryAction.java:50)
>> at java.security.AccessController.doPrivileged(Native Method)
>> at java.awt.Toolkit.loadLibraries(Toolkit.java:1605)
>> at java.awt.Toolkit.<clinit>(Toolkit.java:1627)
>> at sun.awt.AppContext$2.run(AppContext.java:240)
>> at sun.awt.AppContext$2.run(AppContext.java:226)
>> at java.security.AccessController.doPrivileged(Native Method)
>> at sun.awt.AppContext.initMainAppContext(AppContext.java:226)
>> at sun.awt.AppContext.access$200(AppContext.java:112)
>> at sun.awt.AppContext$3.run(AppContext.java:306)
>> at java.security.AccessController.doPrivileged(Native Method)
>> at sun.awt.AppContext.getAppContext(AppContext.java:287)
>> at com.sun.jmx.trace.Trace.out(Trace.java:180)
>> - locked <7f8eea490> (a java.lang.Class for com.sun.jmx.trace.Trace)
>> at com.sun.jmx.trace.Trace.isSelected(Trace.java:88)
>> at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.isTraceOn(DefaultMBeanServerInterceptor.java:1830)
>> at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerDynamicMBean(DefaultMBeanServerInterceptor.java:929)
>> at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerObject(DefaultMBeanServerInterceptor.java:916)
>> at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerMBean(DefaultMBeanServerInterceptor.java:312)
>> at com.sun.jmx.mbeanserver.JmxMBeanServer$2.run(JmxMBeanServer.java:1195)
>> at java.security.AccessController.doPrivileged(Native Method)
>> at com.sun.jmx.mbeanserver.JmxMBeanServer.initialize(JmxMBeanServer.java:1193)
>> at com.sun.jmx.mbeanserver.JmxMBeanServer.<init>(JmxMBeanServer.java:225)
>> at com.sun.jmx.mbeanserver.JmxMBeanServer.<init>(JmxMBeanServer.java:170)
>> at com.sun.jmx.mbeanserver.JmxMBeanServer.newMBeanServer(JmxMBeanServer.java:1401)
>> at javax.management.MBeanServerBuilder.newMBeanServer(MBeanServerBuilder.java:93)
>> at javax.management.MBeanServerFactory.newMBeanServer(MBeanServerFactory.java:311)
>> - locked <7d824f618> (a javax.management.MBeanServerBuilder)
>> at javax.management.MBeanServerFactory.createMBeanServer(MBeanServerFactory.java:214)
>> at javax.management.MBeanServerFactory.createMBeanServer(MBeanServerFactory.java:175)
>> at sun.management.ManagementFactory.createPlatformMBeanServer(ManagementFactory.java:302)
>> at java.lang.management.ManagementFactory.getPlatformMBeanServer(ManagementFactory.java:504)
>> - locked <7f8e00140> (a java.lang.Class for java.lang.management.ManagementFactory)
>> at id.core.version.provider.ProductVersionProvider.<init>(ProductVersionProvider.java:68)
>> at id.core.version.provider.ProductVersionProvider.getInstance(ProductVersionProvider.java:37)
>> - locked <7f8dd00a8> (a java.lang.Class for id.core.version.provider.ProductVersionProvider)
>> at id.core.version.VersionInfo.getProductID(VersionInfo.java:98)
>> at com.id.core.platform.util.application.ProductDirectories.calculateCurrentUserProgramDir(ProductDirectories.java:31)
>> at com.id.core.platform.util.application.ProductDirectories.<clinit>(ProductDirectories.java:22)
>> at com.id.core.platform.repository.BundleRepository.parsePluginFile(BundleRepository.java:235)
>> at com.id.core.platform.repository.BundleRepository.<init>(BundleRepository.java:101)
>> at com.id.core.platform.Platform.bootstrap(Platform.java:178)
>> - locked <7d81cb4c8> (a java.lang.Object)
>> - locked <7d81cb4a8> (a com.id.core.platform.Platform)
>> at com.id.core.platform.activator.Activator$1.run(Activator.java:77)
>> - locked <7d81aca68> (a java.lang.Object)
>>
>> "Thread-2" prio=5 tid=0x00007f9973093800 nid=0x7e03 runnable [0x0000000137b2f000]
>>    java.lang.Thread.State: RUNNABLE
>> at java.lang.ClassLoader$NativeLibrary.load(Native Method)
>> at java.lang.ClassLoader.loadLibrary1(ClassLoader.java:1957)
>> - locked <0x0000000128bc39a8> (a java.util.Vector)
>> - locked <0x0000000128bc3610> (a java.util.Vector)
>> at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1882)
>> at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1843)
>> at java.lang.Runtime.load0(Runtime.java:795)
>> - locked <0x0000000110a457a8> (a java.lang.Runtime)
>> at java.lang.System.load(System.java:1061)
>> at java.lang.ClassLoader$NativeLibrary.load(Native Method)
>> at java.lang.ClassLoader.loadLibrary1(ClassLoader.java:1957)
>> - locked <0x0000000128bc39a8> (a java.util.Vector)
>> - locked <0x0000000128bc3610> (a java.util.Vector)
>> at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1882)
>> at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1864)
>> at java.lang.Runtime.loadLibrary0(Runtime.java:849)
>> - locked <0x0000000110a457a8> (a java.lang.Runtime)
>> at java.lang.System.loadLibrary(System.java:1087)
>> at sun.security.action.LoadLibraryAction.run(LoadLibraryAction.java:67)
>> at sun.security.action.LoadLibraryAction.run(LoadLibraryAction.java:47)
>> at java.security.AccessController.doPrivileged(Native Method)
>> at java.awt.Toolkit.loadLibraries(Toolkit.java:1646)
>> at java.awt.Toolkit.<clinit>(Toolkit.java:1668)
>> at sun.awt.AppContext$2.run(AppContext.java:271)
>> at sun.awt.AppContext$2.run(AppContext.java:260)
>> at java.security.AccessController.doPrivileged(Native Method)
>> at sun.awt.AppContext.initMainAppContext(AppContext.java:260)
>> at sun.awt.AppContext.access$200(AppContext.java:133)
>> at sun.awt.AppContext$3.run(AppContext.java:316)
>> at sun.awt.AppContext$3.run(AppContext.java:298)
>> at java.security.AccessController.doPrivileged(Native Method)
>> at sun.awt.AppContext.getAppContext(AppContext.java:297)
>> at javax.imageio.spi.IIORegistry.getDefaultInstance(IIORegistry.java:154)
>> at com.id.external.javax.media.jai.Services.register(Services.java:20)
>> at com.id.external.javax.media.jai.activator.Activator.start(Activator.java:26)
>> at org.eclipse.osgi.framework.internal.core.BundleContextImpl$1.run(BundleContextImpl.java:711)
>> at java.security.AccessController.doPrivileged(Native Method)
>> at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:702)
>> at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:683)
>> at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:381)
>> at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:299)
>> at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:291)
>> at com.id.core.platform.repository.BundleRepository.startBundle(BundleRepository.java:486)
>> at com.id.core.platform.repository.BundleRepository.handleResolvedBundle(BundleRepository.java:389)
>> at com.id.core.platform.repository.BundleRepository.scanBundles(BundleRepository.java:269)
>> at com.id.core.platform.repository.BundleRepository.start(BundleRepository.java:118)
>> - locked <0x00000001259d7d20> (a java.lang.Object)
>> at com.id.core.platform.Platform.bootstrap(Platform.java:184)
>> - locked <0x00000001259d4000> (a java.lang.Object)
>> - locked <0x00000001259d3fe0> (a com.id.core.platform.Platform)
>> at com.id.core.platform.activator.Activator$1.run(Activator.java:77)
>> - locked <0x00000001259ce758> (a java.lang.Object)
>>
>> I've been looking in the source but not sure if those fixes are already in the jdk 1.7u forest.
>>
>> Erik Vanherck
>>
>> ________________________________
>>
>> Inventive Designers' Email Disclaimer:
>> http://www.inventivedesigners.com/email-disclaimer
>
>

________________________________

Inventive Designers' Email Disclaimer:
http://www.inventivedesigners.com/email-disclaimer


More information about the macosx-port-dev mailing list