Java类加载器问题或并发错误?
在WebLogic应用程序正常运行数周后,我突然遇到一个异常:Java类加载器问题或并发错误?,java,weblogic,classloader,static-initializer,Java,Weblogic,Classloader,Static Initializer,在WebLogic应用程序正常运行数周后,我突然遇到一个异常: <Oct 25, 2014 9:31:11 PM EDT> <Error> <HTTP> <BEA-101020> <[ServletContext@60724164[app:whatever3000 module:whatever3000.war path: spec-version:2.5]] Servlet failed with Exception
<Oct 25, 2014 9:31:11 PM EDT> <Error> <HTTP> <BEA-101020>
<[ServletContext@60724164[app:whatever3000 module:whatever3000.war path:
spec-version:2.5]] Servlet failed with Exception
java.lang.ExceptionInInitializerError
java.util.ConcurrentModificationException
at java.util.Hashtable$Enumerator.next(Hashtable.java:1017)
at java.util.Hashtable.putAll(Hashtable.java:469)
at b.CommonStuff.load(CommonStuff.java:55)
at b.CommonStuff.<clinit>(CommonStuff.java:77)
at b.Password.<clinit>(Password.java:44)
at a.doIt(Whatever.java:99)
这是异常的起源:
<Oct 25, 2014 9:31:11 PM EDT> <Error> <HTTP> <BEA-101020>
<[ServletContext@60724164[app:whatever3000 module:whatever3000.war path:
spec-version:2.5]] Servlet failed with Exception
java.lang.ExceptionInInitializerError
java.util.ConcurrentModificationException
at java.util.Hashtable$Enumerator.next(Hashtable.java:1017)
at java.util.Hashtable.putAll(Hashtable.java:469)
at b.CommonStuff.load(CommonStuff.java:55)
at b.CommonStuff.<clinit>(CommonStuff.java:77)
at b.Password.<clinit>(Password.java:44)
at a.doIt(Whatever.java:99)
我不能盲目地尝试,因为它在一家大公司的生产应用程序中。因此,我试图了解我的错误所在,以及如何在午夜重载类时初始化这些变量。
有什么想法吗
这可能是WebLogic类加载器问题吗?在初始化此类之前,类/实例无法访问某些类的成员。因此,在静态构造函数返回之前,没有人可以访问新创建的
prp
。在静态{}
块中移动prp
初始值设定项不会有任何区别。另外,“old”commontuff
中的“old”prp
和“new”prp
没有以任何方式连接(因为“old”和“new”commontuff
是JVM的不同类)。这一切都使得并发修改prp
的可能性看起来很奇怪
我相信原因在另一个地方。请注意堆栈跟踪的第一行:异常由哈希表的枚举器引发。下面是putAll
方法的代码(与JDK 8一样,可能多年没有改变):
for(Map.entry)这看起来可能是原因。其他人单独进行了相同的诊断。我添加了clone(),我们将在接下来的几周内看到它是否有效。谢谢。
for (Map.Entry<? extends K, ? extends V> e : t.entrySet())
put(e.getKey(), e.getValue());