IllegalStateException:无法覆盖Guava map.put中的原因

时间:2011-08-02 13:09:15

标签: java jboss guava

我使用

创建地图
new MapMaker().softValues().maximumSize(cacheSize).makeMap();

这似乎工作正常,但是,在服务器上部署并将新元素放入地图后立即访问后,我有时会遇到以下异常:

java.lang.IllegalStateException: Can't overwrite cause
  at java.lang.Throwable.initCause(Throwable.java:320)
  at org.jboss.mx.loading.RepositoryClassLoader.findClass(RepositoryClassLoader.java:624)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
  at org.jboss.mx.loading.RepositoryClassLoader.loadClassImpl(RepositoryClassLoader.java:474)
  at org.jboss.mx.loading.RepositoryClassLoader.loadClass(RepositoryClassLoader.java:415)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
  at com.google.common.collect.CustomConcurrentHashMap$2.iterator(CustomConcurrentHashMap.java:828)
  at java.util.AbstractCollection.remove(AbstractCollection.java:241)
  at com.google.common.collect.CustomConcurrentHashMap$Segment.removeFromChain(CustomConcurrentHashMap.java:2599)
  at com.google.common.collect.CustomConcurrentHashMap$Segment.processPendingCleanup(CustomConcurrentHashMap.java:2772)
  at com.google.common.collect.CustomConcurrentHashMap$Segment.runLockedCleanup(CustomConcurrentHashMap.java:2860)
  at com.google.common.collect.CustomConcurrentHashMap$Segment.preWriteCleanup(CustomConcurrentHashMap.java:2806)
  at com.google.common.collect.CustomConcurrentHashMap$Segment.put(CustomConcurrentHashMap.java:2374)
  at com.google.common.collect.CustomConcurrentHashMap.put(CustomConcurrentHashMap.java:3346)
  at my.app.cache.CacheImplGoogleGuava.put(CacheImplGoogleGuava.java:36)
...

可能是什么原因?

---更新:

JBoss版本是5.

在Throwable.initCause中设置断点,显示ClassNotFoundException消息: Invalid use of destroyed classloader for com.google.common.collect.Iterators, UCL destroyed at: 并使用Stacktrace

ClassNotFoundException(Throwable).initCause(Throwable):320
UnifiedClassLoader3(RepositoryClassLoader).findClass(String):628
...
UnifiedClassLoader3(ClassLoader).loadClass(String):248
CustomConcurrentHashMap$2.iterator():828
CustomConcurrentHashMap$2(AbstractCollection<E>).remove(Object):241
CustomConcurrentHashMap$Segment.enqueueCleanup(...):2738
CustomConcurrentHashMap$Segment.unsetValue(...):2662
CustomConcurrentHashMap<K, V>.reclaimValue(...)
CustomConcurrentHashMap$SoftValueReference<K, V>.finalizeReferent():1637
...
Method.invoke:574
Finalizer.claenUp:154
Finalizer.run:127

从堆栈跟踪中,似乎地图中的某个对象已完成,finalizeReferent无法加载类com.google.common.collect.Iterators

2 个答案:

答案 0 :(得分:5)

您的问题似乎与MapMaker或一般的番石榴无关。

您只能看到处理另一个异常时发生的异常(不幸的是)。

Throwable.initCause()在调用异常时抛出异常,同时已经为当前Throwable指定了原因(通过方法或构造函数`。

RepositoryClassLoader.findClass()方法似乎正在处理一些它期望没有原因的异常,但实际上它已经有一个原因集,它会触发这个异常。

不幸的是,您在此处看到的异常隐藏了实际的异常(这可能对解决问题更为重要)。

尝试在{320}或Throwable.initCause()(第624行)的RepositoryClassLoader.findClass()处设置一个breakpoit并重现问题(希望)在您的局部变量视图中看到“真实”异常IDE。

答案 1 :(得分:2)

这似乎是一个已知的JBoss错误,可能已在平台的新版本中得到解决。这是至少一个类似的错误:

JBREM-552: cannot init cause of ClassCastException

您可以尝试升级您的JBoss版本(虽然这个特定的错误意味着修复是在2006年)或者如果您的版本是最新的,则提交另一个错误。可能是修复很草率,只修复了该bug报告的作者报告的一个案例,而不是类似案例。