1

我在 Grails 2.0.4 应用程序中得到以下堆栈跟踪:

java.lang.ArrayIndexOutOfBoundsException: 6170
        at com.springsource.loaded.NameRegistry.getIdFor(NameRegistry.java:44)
        at com.springsource.loaded.NameRegistry.getIdOrAllocateFor(NameRegistry.java:59)
        at com.springsource.loaded.TypeRegistry.getTypeIdFor(TypeRegistry.java:756)
        at com.springsource.loaded.MethodInvokerRewriter$RewriteClassAdaptor$RewritingMethodAdapter.rewritePUTSTATIC(MethodInvokerRewriter.java:789)
        at com.springsource.loaded.MethodInvokerRewriter$RewriteClassAdaptor$RewritingMethodAdapter.visitFieldInsn(MethodInvokerRewriter.java:708)
        at sl.org.objectweb.asm.ClassReader.accept(Unknown Source)
        at sl.org.objectweb.asm.ClassReader.accept(Unknown Source)
        at com.springsource.loaded.MethodInvokerRewriter.rewrite(MethodInvokerRewriter.java:280)
        at com.springsource.loaded.MethodInvokerRewriter.rewrite(MethodInvokerRewriter.java:83)
        at com.springsource.loaded.TypeRegistry.methodCallRewrite(TypeRegistry.java:767)
        at com.springsource.loaded.agent.ModifyDefineInClassLoaderForClassArtifactsType.modify(ModifyDefineInClassLoaderForClassArtifactsType.java:77)
        at org.codehaus.groovy.reflection.ClassLoaderForClassArtifacts.define(ClassLoaderForClassArtifacts.java)
        at org.codehaus.groovy.reflection.ClassLoaderForClassArtifacts$1.run(ClassLoaderForClassArtifacts.java:86)
        at org.codehaus.groovy.reflection.ClassLoaderForClassArtifacts$1.run(ClassLoaderForClassArtifacts.java:84)
        at java.security.AccessController.doPrivileged(Native Method)
        at org.codehaus.groovy.reflection.ClassLoaderForClassArtifacts.defineClassAndGetConstructor(ClassLoaderForClassArtifacts.java:84)
        at org.codehaus.groovy.runtime.callsite.CallSiteGenerator.compilePogoMethod(CallSiteGenerator.java:217)
        at org.codehaus.groovy.reflection.CachedMethod.createPogoMetaMethodSite(CachedMethod.java:228)
        at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.createCachedMethodSite(PogoMetaMethodSite.java:207)
        at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.createPogoMetaMethodSite(PogoMetaMethodSite.java:183)
        at groovy.lang.MetaClassImpl.createPogoCallCurrentSite(MetaClassImpl.java:3022)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.createCallCurrentSite(CallSiteArray.java:95)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:46)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:133)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:145)
        < actual call site in my code, some method call to the same service the original method is in>

显然我的 google-Fu 已经失去了我,或者以前没有人遇到过这个问题。甚至搜索都不会com.springsource.loaded.NameRegistry产生任何结果。

在多次尝试相同的操作后,问题通常会消失,但这很难解决。关于我可以寻找什么的任何提示?

我的疯狂猜测是 Spring 正在代理我试图调用的方法,并且不知何故无法在自己的注册表中查找它。这怎么可能是我的错?

编辑:导致此问题的 Stacktrace 中的第一行是一个无害的方法调用,例如以下foo方法bar中的调用:

class FooService {
      def foo(bla, bloerk) {
          1
      }

      def bar() {
          foo(1,2)
      }
}
4

2 回答 2

2

实际上,在使用 GPars 进行批量更新时,我经常看到这一点。我通过将失败的条目添加到批处理完成后执行的重试池来解决该问题。但是,我对解决方案并不满意。但是由于该功能并不是很关键,并且每隔一小时左右运行一次,它只会为很少更新的对象提供一个小的更新故障。

我从来没有在生产模式下看到过这种情况,只是在开发模式下,所以我认为它在某种程度上与 classLoader 的动态重新加载能力有关。我也经常在批处理运行开始时看到这种类型的错误,当 JVM 预热时,事情顺利进行。我将更深入地研究这个问题。如果我发现更有用的东西,我会回帖。

只是想我会回复你的帖子,告诉你你并不孤单。

我在 Mac OSX 上运行:java 版本 "1.6.0_33" Java(TM) SE Runtime Environment (build 1.6.0_33-b03-424-11M3720) Java HotSpot(TM) 64-Bit Server VM (build 20.8-b03- 424,混合模式)

而且我在 Grails 2 -> 2.1 中都看到过这个问题,不要以为我在 1.3.5->1.3.7 中看到过

于 2012-07-23T12:04:01.400 回答
0

您正在尝试读取/存储一个负数,或者存储/读取一个大于 array.size() 的数字。

于 2012-07-05T12:25:57.720 回答