IllegalStateException: не может перезаписать причину в Guava map.put - PullRequest
3 голосов
/ 02 августа 2011

Я создаю карту, используя

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 ]

5 голосов
/ 02 августа 2011

Ваша проблема, по-видимому, не связана с MapMaker или Гуавой в целом.

Вы видите только исключение, которое происходит при обработке другого исключения (к сожалению).

Throwable.initCause() выдаетисключение, когда оно вызывается, когда для текущего Throwable уже указана причина (либо с помощью метода, либо с помощью конструктора).

Кажется, что метод RepositoryClassLoader.findClass() обрабатывает некое исключение, которого он ожидает не иметьпричина, но на самом деле она уже имеет набор причин, который вызывает это исключение.

К сожалению, исключение, которое вы видите здесь, скрывает фактическое исключение (которое, вероятно, будет гораздо важнее для решения проблемы).

Попробуйте установить точку останова в Throwable.initCause() в строке 320 или RepositoryClassLoader.findClass() (в строке 624) и воспроизвести проблему, чтобы (надеюсь) увидеть «реальное» исключение в представлении локальных переменных вашей IDE.

2 голосов
/ 02 августа 2011

Это, кажется, известная ошибка JBoss, которая, возможно, уже была исправлена ​​в новых версиях платформы.Вот как минимум одна похожая ошибка:

JBREM-552: невозможно инициировать причину ClassCastException

Вы можете попробовать обновить версию JBoss (хотя эта конкретная ошибка подразумеваетисправление было в 2006 году) или добавление другой ошибки, если ваша версия обновлена.Возможно, это исправление было небрежным и исправляло только один случай, о котором сообщил автор этой ошибки, а не похожие случаи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...