Java WebSphere7中对象保留内存和共享类缓存已满100%时Dozer中的ClassCastException

Java WebSphere7中对象保留内存和共享类缓存已满100%时Dozer中的ClassCastException,java,shared-memory,classcastexception,websphere-7,dozer,Java,Shared Memory,Classcastexception,Websphere 7,Dozer,我们在运行在IBMWebSphere7上的J2EE应用程序中使用dozer映射来映射两个类。我们把它当作 mapper.map(classA,Class.forName(classB)) 这总是有效的,除非非常偶尔,当它因ClassCastException失败时(在两年的生产中发生一次,在测试区域中每3或4个月发生一次)。当发生此异常时,我们将继续获取它,直到回收节点为止。(当时其他节点工作正常)。在检查生成的转储时,我们注意到以下几点 100%使用对象(保留)内存 共享类缓存已满100%

我们在运行在IBMWebSphere7上的J2EE应用程序中使用dozer映射来映射两个类。我们把它当作

mapper.map(classA,Class.forName(classB))

这总是有效的,除非非常偶尔,当它因ClassCastException失败时(在两年的生产中发生一次,在测试区域中每3或4个月发生一次)。当发生此异常时,我们将继续获取它,直到回收节点为止。(当时其他节点工作正常)。在检查生成的转储时,我们注意到以下几点

  • 100%使用对象(保留)内存
  • 共享类缓存已满100%
所有其他参数似乎都正常

我们的假设是,当源类和目标类由不同的类加载器加载时,就会发生ClassCastException

这是一个正确的假设吗?如果是这样,我们如何确定它(我们当时有堆转储和线程转储)。

还有什么会导致这样的问题?

还有什么需要调查的吗?

对此有任何可能的解决方案吗?

这是一个正确的假设吗?是的,很有可能,您可以尝试确保类加载器在像Thread.currentThread();之后重新设置

要设置正确的类加载器,请通过org.dozer.util.DozerClassLoader显式设置dozer的类加载器,并设置classB.getClass().getClassLoader(),或者使用mapper.getClass().getClassLoader()在线程上下文中设置类加载器。 别忘了放回原来的版本,否则您的应用程序会出现CNF异常

这是一个正确的假设吗?是的,很有可能,您可以尝试确保类加载器在像Thread.currentThread();之后重新设置

要设置正确的类加载器,请通过org.dozer.util.DozerClassLoader显式设置dozer的类加载器,并设置classB.getClass().getClassLoader(),或者使用mapper.getClass().getClassLoader()在线程上下文中设置类加载器。
别忘了把原来的放回原处,否则你的应用程序会出现CNF异常

我们在类缓存中有类似的ClassCastException,但在Dozer中没有。我们也使用WebSphere。我们怀疑这些类以某种方式被垃圾收集并再次加载。但我们从未找到解决方案……这可能是一个正确的假设吗?是的,很有可能,您可以尝试确保类加载器在像
Thread.currentThread().setContextClassLoader(paramClassLoader)这样的上下文之前是连续的并将其重置回来after@RiadhHAJAMOR如何在这种情况下使用类加载器?@rest\u day您有两个选项,或者通过
org.dozer.util.DozerClassLoader
显式设置dozer的类加载器,或者设置
classB.getClass().getClassLoader()
或者在线程上下文中设置类加载器,其中
mapper.getClass().getClassLoader()
并且不要忘了放回原来的一个,否则您将使用application@RiadhHAJAMOR想把你的评论变成一个答案。我会接受的,我们有类似的ClassCastException和类缓存,但没有Dozer。我们也使用WebSphere。我们怀疑这些类以某种方式被垃圾收集并再次加载。但我们从未找到解决方案……这可能是一个正确的假设吗?是的,很有可能,您可以尝试确保类加载器在像
Thread.currentThread().setContextClassLoader(paramClassLoader)这样的上下文之前是连续的并将其重置回来after@RiadhHAJAMOR如何在这种情况下使用类加载器?@rest\u day您有两个选项,或者通过
org.dozer.util.DozerClassLoader
显式设置dozer的类加载器,或者设置
classB.getClass().getClassLoader()
或者在线程上下文中设置类加载器,其中
mapper.getClass().getClassLoader()
并且不要忘了放回原来的一个,否则您将使用application@RiadhHAJAMOR想把你的评论变成一个答案。我会接受的