【问题标题】:IllegalStateException: Can't overwrite cause in Guava map.putIllegalStateException:无法覆盖 Guava map.put 中的原因
【发布时间】:2011-08-02 13:09:15
【问题描述】:

我使用

创建地图
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 无法加载。

【问题讨论】:

  • 这看起来更像是 JBoss 问题而不是 Guava 问题。由于 Guava 代码,您只是碰巧碰到了它。

标签: java jboss guava


【解决方案1】:

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

您只会看到在处理另一个异常时发生的异常(很遗憾)。

Throwable.initCause() 在已为当前Throwable 指定原因(通过方法或构造函数)被调用时引发异常。

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

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

尝试在第 320 行的 Throwable.initCause()RepositoryClassLoader.findClass()(第 624 行)设置断点,然后重现问题以(希望)在 IDE 的局部变量视图中查看“真正的”异常。

【讨论】:

  • 如果我理解正确的话,原始异常被“隐藏”的事实来自一个可能的 JBoss 错误 552,它没有完全解决。然而,我最初的 ClassNotFoundException 异常(请参阅更新的问题)似乎有一个原因在于番石榴的某个地方,不是吗?
  • @stacktracer:这可能是由 Guava 中的某些东西引起的,但我从未见过该错误消息,它似乎是 JBoss 特定的。
【解决方案2】:

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

JBREM-552: cannot init cause of ClassCastException

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

【讨论】:

    猜你喜欢
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    相关资源
    最近更新 更多