Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Fixed
-
1.7.0
-
None
-
Weblogic 9.2 on Linux, but should not be relevant
Description
The problem lies in the class org.apache.commons.beanutils.MethodUtils. This class is keeping a global cache in a non synchronized WeakHashMap. WeakHashMap is not thread safe and required external synchronization. The lack of synchronization can cause corruption and the WeakHashMap.get() method to go into an infinite loop.
Googling "WeakHashMap infinite loop" returns many cases of similar problem with WeakHashMap. The solution is to decorate the WeakHashMap in a synchronized Map as described in this thread:
http://dev.eclipse.org/mhonarc/lists/aspectj-users/msg08824.html
The modification to make the MethodUtils cache thread safe is a one line change.
Before:
private static WeakHashMap cache = new WeakHashMap();
After:
private static Map cache = Collections.synchronizedMap(new WeakHashMap());
Example of thread dump
"ExecuteThread: '0' for queue: 'weblogic.kernel.Default'" id=13 idx=0x3c tid=5905 prio=5 alive, daemon
at org/apache/commons/beanutils/MethodUtils$MethodDescriptor.equals(MethodUtils.java:828)[optimized]
at java/util/WeakHashMap.eq(WeakHashMap.java:254)[inlined]
at java/util/WeakHashMap.get(WeakHashMap.java:345)[optimized]
at org/apache/commons/beanutils/MethodUtils.getMatchingAccessibleMethod(MethodUtils.java:530)[optimized]
at org/apache/commons/beanutils/MethodUtils.invokeMethod(MethodUtils.java:209)[inlined]
::::
"ExecuteThread: '1' for queue: 'weblogic.kernel.Default'" id=14 idx=0x40 tid=5906 prio=5 alive, daemon
at org/apache/commons/beanutils/MethodUtils$MethodDescriptor.equals(MethodUtils.java:833)[optimized]
at java/util/WeakHashMap.eq(WeakHashMap.java:254)[inlined]
at java/util/WeakHashMap.get(WeakHashMap.java:345)[optimized]
at org/apache/commons/beanutils/MethodUtils.getMatchingAccessibleMethod(MethodUtils.java:530)[optimized]
at org/apache/commons/beanutils/MethodUtils.invokeMethod(MethodUtils.java:209)[inlined]
:::
"ExecuteThread: '2' for queue: 'weblogic.kernel.Default'" id=15 idx=0x44 tid=5907 prio=5 alive, daemon
at org/apache/commons/beanutils/MethodUtils$MethodDescriptor.equals(MethodUtils.java:833)[optimized]
at java/util/WeakHashMap.eq(WeakHashMap.java:254)[inlined]
at java/util/WeakHashMap.get(WeakHashMap.java:345)[optimized]
at org/apache/commons/beanutils/MethodUtils.getMatchingAccessibleMethod(MethodUtils.java:530)[optimized]
at org/apache/commons/beanutils/MethodUtils.invokeMethod(MethodUtils.java:209)[inlined]
Attachments
Issue Links
- is cloned by
-
BEANUTILS-373 CLONE - MethodUtils is not thread safe because WeakFastHashMap which uses WeakHashMap is not thread-safe.
- Closed
- is related to
-
BEANUTILS-509 WeakHashmap enters into infinite loop in WrapDynaClass.java
- Open