GateNLP / gate-core

The GATE Embedded core API and GATE Developer application
GNU Lesser General Public License v3.0
76 stars 29 forks source link

Deadlock when loading pipeline #27

Closed johann-petrak closed 6 years ago

johann-petrak commented 6 years ago

Java 9.0.4 and GATE 8.5-alpha1, build 5448:

While loading a pipeline the GUI locked up. The console output shows

Deadlocked Thread:
------------------
"LoadResourceFromFileAction" prio=1 Id=34 BLOCKED on gate.util.GateClassLoader@231f98ef owned by "AWT-EventQueue-0" Id=14
    at java.base@9.0.4/java.lang.ClassLoader.loadClass(ClassLoader.java:543)
    -  blocked on gate.util.GateClassLoader@231f98ef
    at gate.util.GateClassLoader.loadClass(GateClassLoader.java:208)
    at gate.util.GateClassLoader.loadClass(GateClassLoader.java:225)
    at gate.util.GateClassLoader.loadClass(GateClassLoader.java:148)
    at java.base@9.0.4/java.lang.Class.forName0(Native Method)
    at java.base@9.0.4/java.lang.Class.forName(Class.java:375)
    at java.desktop@9.0.4/com.sun.beans.finder.ClassFinder.findClass(ClassFinder.java:103)
    at java.desktop@9.0.4/com.sun.beans.finder.InstanceFinder.instantiate(InstanceFinder.java:94)
    ...

    java.base@9.0.4/java.lang.ClassLoader.loadClass(ClassLoader.java:543)
    gate.util.GateClassLoader.loadClass(GateClassLoader.java:208)
    gate.util.GateClassLoader.loadClass(GateClassLoader.java:225)
    gate.util.GateClassLoader.loadClass(GateClassLoader.java:148)
    java.base@9.0.4/java.lang.Class.forName0(Native Method)
    java.base@9.0.4/java.lang.Class.forName(Class.java:375)
    java.desktop@9.0.4/com.sun.beans.finder.ClassFinder.findClass(ClassFinder.java:103)
    java.desktop@9.0.4/com.sun.beans.finder.InstanceFinder.instantiate(InstanceFinder.java:94)
    java.desktop@9.0.4/com.sun.beans.finder.InstanceFinder.find(InstanceFinder.java:66)
    java.desktop@9.0.4/java.beans.Introspector.findExplicitBeanInfo(Introspector.java:484)
    java.desktop@9.0.4/java.beans.Introspector.<init>(Introspector.java:434)
    java.desktop@9.0.4/java.beans.Introspector.getBeanInfo(Introspector.java:205)
    gate.creole.CreoleAnnotationHandler.processParameters(CreoleAnnotationHandler.java:455)
    gate.creole.CreoleAnnotationHandler.processCreoleResourceAnnotations(CreoleAnnotationHandler.java:305)
    gate.creole.CreoleAnnotationHandler.processAnnotationsForResource(CreoleAnnotationHandler.java:275)
    gate.creole.CreoleAnnotationHandler.processAnnotations(CreoleAnnotationHandler.java:245)
    gate.creole.CreoleAnnotationHandler.processAnnotations(CreoleAnnotationHandler.java:248)
    gate.creole.CreoleAnnotationHandler.processAnnotations(CreoleAnnotationHandler.java:231)
    gate.creole.CreoleRegisterImpl.processFullCreoleXmlTree(CreoleRegisterImpl.java:295)
    gate.creole.CreoleRegisterImpl.parseDirectory(CreoleRegisterImpl.java:279)
    gate.creole.CreoleRegisterImpl.registerPlugin(CreoleRegisterImpl.java:194)
    gate.util.persistence.PersistenceManager.loadObjectFromUrl(PersistenceManager.java:1294)
    gate.util.persistence.PersistenceManager.loadObjectFromFile(PersistenceManager.java:1213)
    gate.gui.MainFrame$LoadResourceFromFileAction$1.run(MainFrame.java:3685)
    java.base@9.0.4/java.lang.Thread.run(Thread.java:844)
Deadlocked Thread:
------------------
"AWT-EventQueue-0" prio=6 Id=14 BLOCKED on gate.util.GateClassLoader@667e834 owned by "LoadResourceFromFileAction" Id=34
    at java.base@9.0.4/java.lang.ClassLoader.loadClass(ClassLoader.java:543)
    -  blocked on gate.util.GateClassLoader@667e834
    at gate.util.GateClassLoader.loadClass(GateClassLoader.java:208)
    at gate.util.GateClassLoader.loadClass(GateClassLoader.java:248)
    at gate.util.GateClassLoader.loadClass(GateClassLoader.java:148)
    at java.base@9.0.4/java.lang.Class.forName0(Native Method)
    at java.base@9.0.4/java.lang.Class.forName(Class.java:375)
    at gate.gui.MainFrame.getIcon(MainFrame.java:323)
    at gate.gui.MainFrame.getIcon(MainFrame.java:305)
    ...

    java.base@9.0.4/java.lang.ClassLoader.loadClass(ClassLoader.java:543)
    gate.util.GateClassLoader.loadClass(GateClassLoader.java:208)
    gate.util.GateClassLoader.loadClass(GateClassLoader.java:248)
    gate.util.GateClassLoader.loadClass(GateClassLoader.java:148)
    java.base@9.0.4/java.lang.Class.forName0(Native Method)
    java.base@9.0.4/java.lang.Class.forName(Class.java:375)
    gate.gui.MainFrame.getIcon(MainFrame.java:323)
    gate.gui.MainFrame.getIcon(MainFrame.java:305)
    gate.groovy.GroovySupport.getActions(GroovySupport.java:113)
    gate.gui.MainFrame$ToolsMenu$1.run(MainFrame.java:4510)
    java.desktop@9.0.4/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
    java.desktop@9.0.4/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:764)
    java.desktop@9.0.4/java.awt.EventQueue.access$500(EventQueue.java:97)
    java.desktop@9.0.4/java.awt.EventQueue$3.run(EventQueue.java:717)
    java.desktop@9.0.4/java.awt.EventQueue$3.run(EventQueue.java:711)
    java.base@9.0.4/java.security.AccessController.doPrivileged(Native Method)
    java.base@9.0.4/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:89)
    java.desktop@9.0.4/java.awt.EventQueue.dispatchEvent(EventQueue.java:734)
    java.desktop@9.0.4/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:199)
    java.desktop@9.0.4/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
    java.desktop@9.0.4/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
    java.desktop@9.0.4/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
    java.desktop@9.0.4/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    java.desktop@9.0.4/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
johann-petrak commented 6 years ago

Full output for kill -3

2018-03-18 14:45:23
Full thread dump Java HotSpot(TM) 64-Bit Server VM (9.0.4+11 mixed mode):

"LoadResourceFromFileAction" #34 prio=1 os_prio=0 tid=0x00007f0cecab8800 nid=0x6a53 waiting for monitor entry [0x00007f0ca6ce9000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at java.lang.ClassLoader.loadClass(java.base@9.0.4/ClassLoader.java:543)
    - waiting to lock <0x00000000c05fe288> (a gate.util.GateClassLoader)
    at gate.util.GateClassLoader.loadClass(GateClassLoader.java:208)
    at gate.util.GateClassLoader.loadClass(GateClassLoader.java:225)
    at gate.util.GateClassLoader.loadClass(GateClassLoader.java:148)
    at java.lang.Class.forName0(java.base@9.0.4/Native Method)
    at java.lang.Class.forName(java.base@9.0.4/Class.java:375)
    at com.sun.beans.finder.ClassFinder.findClass(java.desktop@9.0.4/ClassFinder.java:103)
    at com.sun.beans.finder.InstanceFinder.instantiate(java.desktop@9.0.4/InstanceFinder.java:94)
    at com.sun.beans.finder.InstanceFinder.find(java.desktop@9.0.4/InstanceFinder.java:66)
    at java.beans.Introspector.findExplicitBeanInfo(java.desktop@9.0.4/Introspector.java:484)
    at java.beans.Introspector.<init>(java.desktop@9.0.4/Introspector.java:434)
    at java.beans.Introspector.getBeanInfo(java.desktop@9.0.4/Introspector.java:205)
    at gate.creole.CreoleAnnotationHandler.processParameters(CreoleAnnotationHandler.java:455)
    at gate.creole.CreoleAnnotationHandler.processCreoleResourceAnnotations(CreoleAnnotationHandler.java:305)
    at gate.creole.CreoleAnnotationHandler.processAnnotationsForResource(CreoleAnnotationHandler.java:275)
    at gate.creole.CreoleAnnotationHandler.processAnnotations(CreoleAnnotationHandler.java:245)
    at gate.creole.CreoleAnnotationHandler.processAnnotations(CreoleAnnotationHandler.java:248)
    at gate.creole.CreoleAnnotationHandler.processAnnotations(CreoleAnnotationHandler.java:231)
    at gate.creole.CreoleRegisterImpl.processFullCreoleXmlTree(CreoleRegisterImpl.java:295)
    at gate.creole.CreoleRegisterImpl.parseDirectory(CreoleRegisterImpl.java:279)
    at gate.creole.CreoleRegisterImpl.registerPlugin(CreoleRegisterImpl.java:194)
    at gate.util.persistence.PersistenceManager.loadObjectFromUrl(PersistenceManager.java:1294)
    at gate.util.persistence.PersistenceManager.loadObjectFromFile(PersistenceManager.java:1213)
    at gate.gui.MainFrame$LoadResourceFromFileAction$1.run(MainFrame.java:3685)
    at java.lang.Thread.run(java.base@9.0.4/Thread.java:844)

"TimerQueue" #25 daemon prio=5 os_prio=0 tid=0x00007f0cecb90800 nid=0x6a43 waiting on condition [0x00007f0ca6362000]
   java.lang.Thread.State: WAITING (parking)
    at jdk.internal.misc.Unsafe.park(java.base@9.0.4/Native Method)
    - parking to wait for  <0x00000000c07cb460> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.park(java.base@9.0.4/LockSupport.java:194)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@9.0.4/AbstractQueuedSynchronizer.java:2062)
    at java.util.concurrent.DelayQueue.take(java.base@9.0.4/DelayQueue.java:217)
    at javax.swing.TimerQueue.run(java.desktop@9.0.4/TimerQueue.java:171)
    at java.lang.Thread.run(java.base@9.0.4/Thread.java:844)

"MainFrame animation" #24 daemon prio=1 os_prio=0 tid=0x00007f0cecb3a800 nid=0x6a42 in Object.wait() [0x00007f0ca6261000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
    at java.lang.Object.wait(java.base@9.0.4/Native Method)
    - waiting on <no object reference available>
    at gate.gui.MainFrame$CartoonMinder.run(MainFrame.java:5283)
    - waiting to re-lock in wait() <0x00000000c07cbfe0> (a gate.gui.MainFrame$CartoonMinder)
    at java.lang.Thread.run(java.base@9.0.4/Thread.java:844)

"DestroyJavaVM" #16 prio=5 os_prio=0 tid=0x00007f0cec012000 nid=0x6a1c waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"AWT-EventQueue-0" #14 prio=6 os_prio=0 tid=0x00007f0cec46f000 nid=0x6a3a waiting for monitor entry [0x00007f0ca71eb000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at java.lang.ClassLoader.loadClass(java.base@9.0.4/ClassLoader.java:543)
    - waiting to lock <0x00000000de458360> (a gate.util.GateClassLoader)
    at gate.util.GateClassLoader.loadClass(GateClassLoader.java:208)
    at gate.util.GateClassLoader.loadClass(GateClassLoader.java:248)
    at gate.util.GateClassLoader.loadClass(GateClassLoader.java:148)
    at java.lang.Class.forName0(java.base@9.0.4/Native Method)
    at java.lang.Class.forName(java.base@9.0.4/Class.java:375)
    at gate.gui.MainFrame.getIcon(MainFrame.java:323)
    at gate.gui.MainFrame.getIcon(MainFrame.java:305)
    at gate.groovy.GroovySupport.getActions(GroovySupport.java:113)
    at gate.gui.MainFrame$ToolsMenu$1.run(MainFrame.java:4510)
    at java.awt.event.InvocationEvent.dispatch(java.desktop@9.0.4/InvocationEvent.java:313)
    at java.awt.EventQueue.dispatchEventImpl(java.desktop@9.0.4/EventQueue.java:764)
    at java.awt.EventQueue.access$500(java.desktop@9.0.4/EventQueue.java:97)
    at java.awt.EventQueue$3.run(java.desktop@9.0.4/EventQueue.java:717)
    at java.awt.EventQueue$3.run(java.desktop@9.0.4/EventQueue.java:711)
    at java.security.AccessController.doPrivileged(java.base@9.0.4/Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(java.base@9.0.4/ProtectionDomain.java:89)
    at java.awt.EventQueue.dispatchEvent(java.desktop@9.0.4/EventQueue.java:734)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(java.desktop@9.0.4/EventDispatchThread.java:199)
    at java.awt.EventDispatchThread.pumpEventsForFilter(java.desktop@9.0.4/EventDispatchThread.java:124)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(java.desktop@9.0.4/EventDispatchThread.java:113)
    at java.awt.EventDispatchThread.pumpEvents(java.desktop@9.0.4/EventDispatchThread.java:109)
    at java.awt.EventDispatchThread.pumpEvents(java.desktop@9.0.4/EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.run(java.desktop@9.0.4/EventDispatchThread.java:90)

"AWT-Shutdown" #15 prio=1 os_prio=0 tid=0x00007f0cec46d800 nid=0x6a39 in Object.wait() [0x00007f0ca72ef000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(java.base@9.0.4/Native Method)
    - waiting on <0x00000000c07cb758> (a java.lang.Object)
    at java.lang.Object.wait(java.base@9.0.4/Object.java:516)
    at sun.awt.AWTAutoShutdown.run(java.desktop@9.0.4/AWTAutoShutdown.java:291)
    - waiting to re-lock in wait() <0x00000000c07cb758> (a java.lang.Object)
    at java.lang.Thread.run(java.base@9.0.4/Thread.java:844)

"AWT-XAWT" #13 daemon prio=6 os_prio=0 tid=0x00007f0cec46c000 nid=0x6a38 runnable [0x00007f0ca73f0000]
   java.lang.Thread.State: RUNNABLE
    at sun.awt.X11.XToolkit.waitForEvents(java.desktop@9.0.4/Native Method)
    at sun.awt.X11.XToolkit.run(java.desktop@9.0.4/XToolkit.java:588)
    at sun.awt.X11.XToolkit.run(java.desktop@9.0.4/XToolkit.java:552)
    at java.lang.Thread.run(java.base@9.0.4/Thread.java:844)

"Java2D Disposer" #12 daemon prio=10 os_prio=0 tid=0x00007f0cec46a800 nid=0x6a37 in Object.wait() [0x00007f0ca74f1000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(java.base@9.0.4/Native Method)
    - waiting on <0x00000000c07cbaf8> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(java.base@9.0.4/ReferenceQueue.java:151)
    - waiting to re-lock in wait() <0x00000000c07cbaf8> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(java.base@9.0.4/ReferenceQueue.java:172)
    at sun.java2d.Disposer.run(java.desktop@9.0.4/Disposer.java:144)
    at java.lang.Thread.run(java.base@9.0.4/Thread.java:844)

"Thread Monitor" #10 daemon prio=5 os_prio=0 tid=0x00007f0cec780000 nid=0x6a36 in Object.wait() [0x00007f0cb92cf000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
    at java.lang.Object.wait(java.base@9.0.4/Native Method)
    - waiting on <no object reference available>
    at java.util.TimerThread.mainLoop(java.base@9.0.4/Timer.java:553)
    - waiting to re-lock in wait() <0x00000000c05d56c8> (a java.util.TaskQueue)
    at java.util.TimerThread.run(java.base@9.0.4/Timer.java:506)

"Service Thread" #9 daemon prio=9 os_prio=0 tid=0x00007f0cec367000 nid=0x6a2e runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Common-Cleaner" #8 daemon prio=8 os_prio=0 tid=0x00007f0cec2a8800 nid=0x6a2b in Object.wait() [0x00007f0cb97d2000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
    at java.lang.Object.wait(java.base@9.0.4/Native Method)
    - waiting on <no object reference available>
    at java.lang.ref.ReferenceQueue.remove(java.base@9.0.4/ReferenceQueue.java:151)
    - waiting to re-lock in wait() <0x00000000c03beda8> (a java.lang.ref.ReferenceQueue$Lock)
    at jdk.internal.ref.CleanerImpl.run(java.base@9.0.4/CleanerImpl.java:148)
    at java.lang.Thread.run(java.base@9.0.4/Thread.java:844)
    at jdk.internal.misc.InnocuousThread.run(java.base@9.0.4/InnocuousThread.java:122)

"Sweeper thread" #7 daemon prio=9 os_prio=0 tid=0x00007f0cec299800 nid=0x6a2a runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C1 CompilerThread1" #6 daemon prio=9 os_prio=0 tid=0x00007f0cec297800 nid=0x6a29 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE
   No compile task

"C2 CompilerThread0" #5 daemon prio=9 os_prio=0 tid=0x00007f0cec295800 nid=0x6a28 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE
   No compile task

"Signal Dispatcher" #4 daemon prio=9 os_prio=0 tid=0x00007f0cec293800 nid=0x6a27 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Finalizer" #3 daemon prio=8 os_prio=0 tid=0x00007f0cec27b800 nid=0x6a26 in Object.wait() [0x00007f0cd013f000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(java.base@9.0.4/Native Method)
    - waiting on <0x00000000c03bf7d8> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(java.base@9.0.4/ReferenceQueue.java:151)
    - waiting to re-lock in wait() <0x00000000c03bf7d8> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(java.base@9.0.4/ReferenceQueue.java:172)
    at java.lang.ref.Finalizer$FinalizerThread.run(java.base@9.0.4/Finalizer.java:216)

"Reference Handler" #2 daemon prio=10 os_prio=0 tid=0x00007f0cec273000 nid=0x6a25 waiting on condition [0x00007f0cd0240000]
   java.lang.Thread.State: RUNNABLE
    at java.lang.ref.Reference.waitForReferencePendingList(java.base@9.0.4/Native Method)
    at java.lang.ref.Reference.processPendingReferences(java.base@9.0.4/Reference.java:174)
    at java.lang.ref.Reference.access$000(java.base@9.0.4/Reference.java:44)
    at java.lang.ref.Reference$ReferenceHandler.run(java.base@9.0.4/Reference.java:138)

"VM Thread" os_prio=0 tid=0x00007f0cec269800 nid=0x6a24 runnable 

"GC Thread#0" os_prio=0 tid=0x00007f0cec029800 nid=0x6a1d runnable 

"GC Thread#1" os_prio=0 tid=0x00007f0cec02b000 nid=0x6a1e runnable 

"G1 Main Marker" os_prio=0 tid=0x00007f0cec068000 nid=0x6a22 runnable 

"G1 Marker#0" os_prio=0 tid=0x00007f0cec06a000 nid=0x6a23 runnable 

"G1 Refine#0" os_prio=0 tid=0x00007f0cec02f000 nid=0x6a20 runnable 

"G1 Refine#1" os_prio=0 tid=0x00007f0cec02d000 nid=0x6a1f runnable 

"G1 Young RemSet Sampling" os_prio=0 tid=0x00007f0cec030800 nid=0x6a21 runnable 

"VM Periodic Task Thread" os_prio=0 tid=0x00007f0cec369800 nid=0x6a2f waiting on condition 

JNI global references: 1317

Found one Java-level deadlock:
=============================
"LoadResourceFromFileAction":
  waiting to lock monitor 0x00007f0d00010c80 (object 0x00000000c05fe288, a gate.util.GateClassLoader),
  which is held by "AWT-EventQueue-0"
"AWT-EventQueue-0":
  waiting to lock monitor 0x00007f0cf42f4d00 (object 0x00000000de458360, a gate.util.GateClassLoader),
  which is held by "LoadResourceFromFileAction"

Java stack information for the threads listed above:
===================================================
"LoadResourceFromFileAction":
    at java.lang.ClassLoader.loadClass(java.base@9.0.4/ClassLoader.java:543)
    - waiting to lock <0x00000000c05fe288> (a gate.util.GateClassLoader)
    at gate.util.GateClassLoader.loadClass(GateClassLoader.java:208)
    at gate.util.GateClassLoader.loadClass(GateClassLoader.java:225)
    at gate.util.GateClassLoader.loadClass(GateClassLoader.java:148)
    at java.lang.Class.forName0(java.base@9.0.4/Native Method)
    at java.lang.Class.forName(java.base@9.0.4/Class.java:375)
    at com.sun.beans.finder.ClassFinder.findClass(java.desktop@9.0.4/ClassFinder.java:103)
    at com.sun.beans.finder.InstanceFinder.instantiate(java.desktop@9.0.4/InstanceFinder.java:94)
    at com.sun.beans.finder.InstanceFinder.find(java.desktop@9.0.4/InstanceFinder.java:66)
    at java.beans.Introspector.findExplicitBeanInfo(java.desktop@9.0.4/Introspector.java:484)
    at java.beans.Introspector.<init>(java.desktop@9.0.4/Introspector.java:434)
    at java.beans.Introspector.getBeanInfo(java.desktop@9.0.4/Introspector.java:205)
    at gate.creole.CreoleAnnotationHandler.processParameters(CreoleAnnotationHandler.java:455)
    at gate.creole.CreoleAnnotationHandler.processCreoleResourceAnnotations(CreoleAnnotationHandler.java:305)
    at gate.creole.CreoleAnnotationHandler.processAnnotationsForResource(CreoleAnnotationHandler.java:275)
    at gate.creole.CreoleAnnotationHandler.processAnnotations(CreoleAnnotationHandler.java:245)
    at gate.creole.CreoleAnnotationHandler.processAnnotations(CreoleAnnotationHandler.java:248)
    at gate.creole.CreoleAnnotationHandler.processAnnotations(CreoleAnnotationHandler.java:231)
    at gate.creole.CreoleRegisterImpl.processFullCreoleXmlTree(CreoleRegisterImpl.java:295)
    at gate.creole.CreoleRegisterImpl.parseDirectory(CreoleRegisterImpl.java:279)
    at gate.creole.CreoleRegisterImpl.registerPlugin(CreoleRegisterImpl.java:194)
    at gate.util.persistence.PersistenceManager.loadObjectFromUrl(PersistenceManager.java:1294)
    at gate.util.persistence.PersistenceManager.loadObjectFromFile(PersistenceManager.java:1213)
    at gate.gui.MainFrame$LoadResourceFromFileAction$1.run(MainFrame.java:3685)
    at java.lang.Thread.run(java.base@9.0.4/Thread.java:844)
"AWT-EventQueue-0":
    at java.lang.ClassLoader.loadClass(java.base@9.0.4/ClassLoader.java:543)
    - waiting to lock <0x00000000de458360> (a gate.util.GateClassLoader)
    at gate.util.GateClassLoader.loadClass(GateClassLoader.java:208)
    at gate.util.GateClassLoader.loadClass(GateClassLoader.java:248)
    at gate.util.GateClassLoader.loadClass(GateClassLoader.java:148)
    at java.lang.Class.forName0(java.base@9.0.4/Native Method)
    at java.lang.Class.forName(java.base@9.0.4/Class.java:375)
    at gate.gui.MainFrame.getIcon(MainFrame.java:323)
    at gate.gui.MainFrame.getIcon(MainFrame.java:305)
    at gate.groovy.GroovySupport.getActions(GroovySupport.java:113)
    at gate.gui.MainFrame$ToolsMenu$1.run(MainFrame.java:4510)
    at java.awt.event.InvocationEvent.dispatch(java.desktop@9.0.4/InvocationEvent.java:313)
    at java.awt.EventQueue.dispatchEventImpl(java.desktop@9.0.4/EventQueue.java:764)
    at java.awt.EventQueue.access$500(java.desktop@9.0.4/EventQueue.java:97)
    at java.awt.EventQueue$3.run(java.desktop@9.0.4/EventQueue.java:717)
    at java.awt.EventQueue$3.run(java.desktop@9.0.4/EventQueue.java:711)
    at java.security.AccessController.doPrivileged(java.base@9.0.4/Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(java.base@9.0.4/ProtectionDomain.java:89)
    at java.awt.EventQueue.dispatchEvent(java.desktop@9.0.4/EventQueue.java:734)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(java.desktop@9.0.4/EventDispatchThread.java:199)
    at java.awt.EventDispatchThread.pumpEventsForFilter(java.desktop@9.0.4/EventDispatchThread.java:124)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(java.desktop@9.0.4/EventDispatchThread.java:113)
    at java.awt.EventDispatchThread.pumpEvents(java.desktop@9.0.4/EventDispatchThread.java:109)
    at java.awt.EventDispatchThread.pumpEvents(java.desktop@9.0.4/EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.run(java.desktop@9.0.4/EventDispatchThread.java:90)

Found 1 deadlock.

Heap
 garbage-first heap   total 542720K, used 77680K [0x00000000c0000000, 0x00000000c0101090, 0x0000000100000000)
  region size 1024K, 61 young (62464K), 10 survivors (10240K)
 Metaspace       used 47616K, capacity 49994K, committed 50048K, reserved 1093632K
  class space    used 5518K, capacity 5984K, committed 6016K, reserved 1048576K
johann-petrak commented 6 years ago

Here is another:

Deadlocked Thread:
------------------
"LoadResourceFromFileAction" prio=1 Id=35 BLOCKED on gate.util.GateClassLoader@7c137fd5 owned by "AWT-EventQueue-0" Id=14
    at java.base@9.0.4/java.lang.ClassLoader.loadClass(ClassLoader.java:543)
    -  blocked on gate.util.GateClassLoader@7c137fd5
    at gate.util.GateClassLoader.loadClass(GateClassLoader.java:208)
    at gate.util.GateClassLoader.loadClass(GateClassLoader.java:225)
    at gate.util.GateClassLoader.loadClass(GateClassLoader.java:148)
    at java.base@9.0.4/java.lang.Class.forName0(Native Method)
    at java.base@9.0.4/java.lang.Class.forName(Class.java:292)
    at groovy.lang.MetaClassRegistry$MetaClassCreationHandle.createWithCustomLookup(MetaClassRegistry.java:149)
    at groovy.lang.MetaClassRegistry$MetaClassCreationHandle.create(MetaClassRegistry.java:144)
    ...

    java.base@9.0.4/java.lang.ClassLoader.loadClass(ClassLoader.java:543)
    gate.util.GateClassLoader.loadClass(GateClassLoader.java:208)
    gate.util.GateClassLoader.loadClass(GateClassLoader.java:225)
    gate.util.GateClassLoader.loadClass(GateClassLoader.java:148)
    java.base@9.0.4/java.lang.Class.forName0(Native Method)
    java.base@9.0.4/java.lang.Class.forName(Class.java:292)
    groovy.lang.MetaClassRegistry$MetaClassCreationHandle.createWithCustomLookup(MetaClassRegistry.java:149)
    groovy.lang.MetaClassRegistry$MetaClassCreationHandle.create(MetaClassRegistry.java:144)
    org.codehaus.groovy.reflection.ClassInfo.getMetaClassUnderLock(ClassInfo.java:253)
    org.codehaus.groovy.reflection.ClassInfo.getMetaClass(ClassInfo.java:285)
    org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.getMetaClass(MetaClassRegistryImpl.java:257)
    org.codehaus.groovy.runtime.InvokerHelper.getMetaClass(InvokerHelper.java:875)
    groovy.lang.GroovyObjectSupport.<init>(GroovyObjectSupport.java:34)
    groovy.lang.Binding.<init>(Binding.java:35)
    groovy.lang.GroovyShell.<init>(GroovyShell.java:86)
    gate.groovy.ScriptPR.init(ScriptPR.java:112)
    gate.Factory.createResource(Factory.java:429)
    gate.util.persistence.ResourcePersistence.createObject(ResourcePersistence.java:151)
    gate.util.persistence.PRPersistence.createObject(PRPersistence.java:88)
    gate.util.persistence.LanguageAnalyserPersistence.createObject(LanguageAnalyserPersistence.java:53)
    gate.util.persistence.PersistenceManager.getTransientRepresentation(PersistenceManager.java:793)
    gate.util.persistence.CollectionPersistence.createObject(CollectionPersistence.java:82)
    gate.util.persistence.PersistenceManager.getTransientRepresentation(PersistenceManager.java:793)
    gate.util.persistence.ControllerPersistence.createObject(ControllerPersistence.java:64)
    gate.util.persistence.ConditionalControllerPersistence.createObject(ConditionalControllerPersistence.java:52)
    gate.util.persistence.ConditionalSerialAnalyserControllerPersistence.createObject(ConditionalSerialAnalyserControllerPersistence.java:56)
    gate.util.persistence.PersistenceManager.getTransientRepresentation(PersistenceManager.java:793)
    gate.util.persistence.PersistenceManager.getTransientRepresentation(PersistenceManager.java:774)
    gate.util.persistence.PersistenceManager.loadObjectFromUrl(PersistenceManager.java:1313)
    gate.util.persistence.PersistenceManager.loadObjectFromFile(PersistenceManager.java:1213)
Deadlocked Thread:
------------------
"AWT-EventQueue-0" prio=6 Id=14 BLOCKED on gate.util.GateClassLoader@41881e6c owned by "LoadResourceFromFileAction" Id=35
    at java.base@9.0.4/java.lang.ClassLoader.loadClass(ClassLoader.java:543)
    -  blocked on gate.util.GateClassLoader@41881e6c
    at gate.util.GateClassLoader.loadClass(GateClassLoader.java:208)
    at gate.util.GateClassLoader.loadClass(GateClassLoader.java:248)
    at gate.util.GateClassLoader.loadClass(GateClassLoader.java:148)
    at java.base@9.0.4/java.lang.Class.forName0(Native Method)
    at java.base@9.0.4/java.lang.Class.forName(Class.java:375)
    at gate.gui.MainFrame.getIcon(MainFrame.java:323)
    at gate.gui.MainFrame.getIcon(MainFrame.java:305)
    ...

    java.base@9.0.4/java.lang.ClassLoader.loadClass(ClassLoader.java:543)
    gate.util.GateClassLoader.loadClass(GateClassLoader.java:208)
    gate.util.GateClassLoader.loadClass(GateClassLoader.java:248)
    gate.util.GateClassLoader.loadClass(GateClassLoader.java:148)
    java.base@9.0.4/java.lang.Class.forName0(Native Method)
    java.base@9.0.4/java.lang.Class.forName(Class.java:375)
    gate.gui.MainFrame.getIcon(MainFrame.java:323)
    gate.gui.MainFrame.getIcon(MainFrame.java:305)
    gate.gui.FeaturesSchemaEditor$FeatureEditorRenderer.<init>(FeaturesSchemaEditor.java:446)
    gate.gui.FeaturesSchemaEditor.initGUI(FeaturesSchemaEditor.java:142)
    gate.gui.FeaturesSchemaEditor.init(FeaturesSchemaEditor.java:127)
    gate.Factory.createResource(Factory.java:429)
    gate.Factory.createResource(Factory.java:155)
    gate.gui.NameBearerHandle.buildViews(NameBearerHandle.java:382)
    gate.gui.NameBearerHandle.getLargeView(NameBearerHandle.java:186)
    gate.gui.MainFrame.select(MainFrame.java:445)
    gate.gui.MainFrame$23.processMouseEvent(MainFrame.java:1484)
    gate.gui.MainFrame$23.mouseClicked(MainFrame.java:1329)
    java.desktop@9.0.4/java.awt.AWTEventMulticaster.mouseClicked(AWTEventMulticaster.java:278)
    java.desktop@9.0.4/java.awt.Component.processMouseEvent(Component.java:6581)
    java.desktop@9.0.4/javax.swing.JComponent.processMouseEvent(JComponent.java:3343)
    java.desktop@9.0.4/java.awt.Component.processEvent(Component.java:6343)
    java.desktop@9.0.4/java.awt.Container.processEvent(Container.java:2259)
    java.desktop@9.0.4/java.awt.Component.dispatchEventImpl(Component.java:4961)
    java.desktop@9.0.4/java.awt.Container.dispatchEventImpl(Container.java:2317)
    java.desktop@9.0.4/java.awt.Component.dispatchEvent(Component.java:4793)
    java.desktop@9.0.4/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4904)
    java.desktop@9.0.4/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4548)
    java.desktop@9.0.4/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4480)
    java.desktop@9.0.4/java.awt.Container.dispatchEventImpl(Container.java:2303)
greenwoodma commented 6 years ago

That most recent one looks like being groovy related. Everytime we've switched from one major version of java to another we've seen intermittent issues with groovy causing deadlocks, until the groovy version gets updated. Not sure which version the plugin is currently being used but it might be worth seeing if it can be bumped up to the latest if it isn't already.

ianroberts commented 6 years ago

Fundamentally, this is always going to be a problem as long as it's possible for different threads to grab the synchronization locks on different elements of the plugin classloader chain in different orders. How much would it hurt performance to put a global lock on GateClassLoader.loadClass, at least for non-isolated classloaders?

greenwoodma commented 6 years ago

Not sure, I guess the only way to find out is to give it a try.

ianroberts commented 6 years ago

From the java.lang.ClassLoader javadoc:

Class loaders that support concurrent loading of classes are known as parallel capable class loaders and are required to register themselves at their class initialization time by invoking the ClassLoader.registerAsParallelCapable method. Note that the ClassLoader class is registered as parallel capable by default. However, its subclasses still need to register themselves if they are parallel capable. In environments in which the delegation model is not strictly hierarchical, class loaders need to be parallel capable, otherwise class loading can lead to deadlocks because the loader lock is held for the duration of the class loading process (see loadClass methods).

(my bold). This sounds like exactly our scenario, and I can't see why GateClassLoader wouldn't be capable of parallel loading, so it may be sufficient simply to register ourselves as such in a static initializer.

greenwoodma commented 6 years ago

How had I never noticed that option before. Looks as if it was added in 1.7 which is probably after I did the last major mangling of the classloader. As you say though it sounds exactly like our scenario, so I've added a static block to GATEClassloader so that the registration happens. It will also print a warning (via log.warn) if registration fails. From brief testing it all seems okay, but if you could both give it a try that would be great. @johann-petrak if you could especially double check the apps that were causing you problems before that would be really helpful.

johann-petrak commented 6 years ago

b96506c6abd29741f7db250956ca49fdef1178dc fixed this a reproducable instance of this problem, so closing.