我们使用hazelcast作为分布式缓存。应用程序运行一段时间后,我们开始在类加载中阻塞。以下是堆栈跟踪:
java.lang.Thread.State:在java.lang.ClassLoader.loadClass上的BLOCKED(在对象监视器上)(ClassLoader.java:404) - 已锁定< 0x00002acaac4c4718> (一个java.lang.Object)位于com.hazelcast.nio.ClassLoaderUtil.tryLoadClass的java.lang.ClassLoader.loadClass(ClassLoader.java:357)的sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:308) (ClassLoaderUtil.java:124)at com.hazelcast.nio.ClassLoaderUtil.loadClass(ClassLoaderUtil.java:97)at com.hazelcast.nio.IOUtil $ 1.resolveClass(IOUtil.java:113)at java.io.ObjectInputStream.readNonProxyDesc (ObjectInputStream.java:1613)java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518)java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774)at java.io.ObjectInputStream.readObject0(ObjectInputStream.java: 1351)在java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993)java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918)java. java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)。 io.O bjectInputStream.readObject0(ObjectInputStream.java:1351)位于com.hazelcast的com.hazelcast.nio.serialization.DefaultSerializers $ ObjectSerializer.read(DefaultSerializers.java:196)的java.io.ObjectInputStream.readObject(ObjectInputStream.java:371) .nio.serialization.StreamSerializerAdapter.toObject(StreamSerializerAdapter.java:65)at com.hazelcast.nio.serialization.SerializationServiceImpl.toObject(SerializationServiceImpl.java:260)at com.hazelcast.spi.impl.NodeEngineImpl.toObject(NodeEngineImpl.java) :186)com.hazelcast.map.impl.AbstractMapServiceContextSupport.toObject(AbstractMapServiceContextSupport.java:42),位于com.hazelcast.map.impl的com.hazelcast.map.impl.DefaultMapServiceContext.toObject(DefaultMapServiceContext.java:28)。 proxy.MapProxySupport.toObject(MapProxySupport.java:1038)at com.hazelcast.map.impl.proxy.MapProxyImpl.get(MapProxyImpl.java:84)
每次对一个对象进行反序列化时,Hazelcast都会加载该类。我不确定为什么每次都需要加载类。
有人可以帮忙吗。
答案 0 :(得分:1)
这不是特定于Hazelcast的,无论何时创建实例,您都必须向类加载器询问该类,无论您使用反射还是新调用。问题实际上是当同步的类加载器进入游戏时(比如webapps或者东西)。显然,Hazelcast必须反序列化很多,因此需要很多课程。
内部反序列化现在已经过优化(通过缓存结构实例 - 据我记得)但Java标准序列化(你使用的那个)总是希望类和类还没有被缓存。