You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Shevek (JIRA)" <ji...@apache.org> on 2017/11/20 19:19:00 UTC
[jira] [Created] (GROOVY-8388) Groovy MetaClass manager hangs up
for 2 minutes every 30 minutes
Shevek created GROOVY-8388:
------------------------------
Summary: Groovy MetaClass manager hangs up for 2 minutes every 30 minutes
Key: GROOVY-8388
URL: https://issues.apache.org/jira/browse/GROOVY-8388
Project: Groovy
Issue Type: Bug
Affects Versions: 2.4.12
Environment: Linux x86, OpenJDK8
Reporter: Shevek
Groovy hangs on the host for over 2 minutes, at 30 minute intervals. Here is the stack:
```
at java.util.concurrent.ConcurrentLinkedQueue.remove(ConcurrentLinkedQueue.java:490)
at org.codehaus.groovy.util.ManagedConcurrentLinkedQueue$Element.finalizeReference(ManagedConcurrentLinkedQueue.java:117)
at org.codehaus.groovy.util.ReferenceManager$CallBackedManager.removeStallEntries0(ReferenceManager.java:108)
at org.codehaus.groovy.util.ReferenceManager$CallBackedManager.removeStallEntries(ReferenceManager.java:93)
at org.codehaus.groovy.util.ReferenceManager$CallBackedManager.afterReferenceCreation(ReferenceManager.java:117)
at org.codehaus.groovy.util.ReferenceManager$1.afterReferenceCreation(ReferenceManager.java:135)
at org.codehaus.groovy.util.ManagedReference.<init>(ManagedReference.java:36)
at org.codehaus.groovy.util.ManagedReference.<init>(ManagedReference.java:40)
at org.codehaus.groovy.util.ManagedConcurrentLinkedQueue$Element.<init>(ManagedConcurrentLinkedQueue.java:112)
at org.codehaus.groovy.util.ManagedConcurrentLinkedQueue.add(ManagedConcurrentLinkedQueue.java:62)
at org.codehaus.groovy.reflection.ClassInfo$GlobalClassSet.add(ClassInfo.java:464)
at org.codehaus.groovy.reflection.ClassInfo$1.computeValue(ClassInfo.java:84)
at org.codehaus.groovy.reflection.ClassInfo$1.computeValue(ClassInfo.java:80)
at org.codehaus.groovy.reflection.GroovyClassValuePreJava7$EntryWithValue.<init>(GroovyClassValuePreJava7.java:37)
at org.codehaus.groovy.reflection.GroovyClassValuePreJava7$GroovyClassValuePreJava7Segment.createEntry(GroovyClassValuePreJava7.java:64)
at org.codehaus.groovy.reflection.GroovyClassValuePreJava7$GroovyClassValuePreJava7Segment.createEntry(GroovyClassValuePreJava7.java:55)
at org.codehaus.groovy.util.AbstractConcurrentMap$Segment.put(AbstractConcurrentMap.java:157)
at org.codehaus.groovy.util.AbstractConcurrentMap$Segment.getOrPut(AbstractConcurrentMap.java:100)
at org.codehaus.groovy.util.AbstractConcurrentMap.getOrPut(AbstractConcurrentMap.java:38)
at org.codehaus.groovy.reflection.GroovyClassValuePreJava7.get(GroovyClassValuePreJava7.java:94)
at org.codehaus.groovy.reflection.ClassInfo.getClassInfo(ClassInfo.java:143)
at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.getMetaClass(MetaClassRegistryImpl.java:261)
at org.codehaus.groovy.runtime.InvokerHelper.getMetaClass(InvokerHelper.java:883)
at groovy.lang.GroovyObjectSupport.<init>(GroovyObjectSupport.java:34)
at groovy.lang.Script.<init>(Script.java:42)
at groovy.lang.Script.<init>(Script.java:39)
at groovy.util.DelegatingScript.<init>(DelegatingScript.java:93)
at hive-to-presto.<init>(hive-to-presto.groovy)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.codehaus.groovy.runtime.InvokerHelper.createScript(InvokerHelper.java:431)
at groovy.lang.GroovyShell.parse(GroovyShell.java:700)
at groovy.lang.GroovyShell.parse(GroovyShell.java:709)
[application code hereafter]
```
Stack captured by stack sampling at 10s intervals on a failing application; stack remains consistent for the 2 minute period.
I've noted on concurrency-interest that a couple of the j.u.c classes have slightly surprising (to us) complexity measures, partly because we're so used to j.u methods being very efficient; it's entirely possible that ConcurrentLinkedQueue.remove() takes linear time.
History: Sometime around groovy 2.4.7 - fixed in groovy 2.4.8 - there was a bug where groovy never released references to classes, and would crash the JVM with something like 'Out of compressed OOPS'. The fix for this apparently introduced a walk of a queue, which now hangs up the JVM instead of breaking it.
On groovy 2.4.7, the number of classes loaded before crash was about 238,000. We may be able to work around this by caching loaded classes, but that will impact the semantics of our application.
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)