2015-04-21 27 views
2

我們使用hazelcast作爲分佈式緩存。應用程序運行一段時間後,我們開始在類加載中阻塞。以下是堆棧跟蹤:鎖定在類加載,而quering hazelcast

java.lang.Thread.State中:BLOCKED(對象監視器上)在java.lang.ClassLoader.loadClass(ClassLoader.java:404) - 鎖定< 0x00002acaac4c4718>(一個java.lang中.Object)at sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:308)at java.lang.ClassLoader.loadClass(ClassLoader.java:357)at com.hazelcast.nio.ClassLoaderUtil.tryLoadClass(ClassLoaderUtil.java:在com.hazelcast.nio處com.hazelcast.nio.ClassLoaderUtil.loadClass(ClassLoaderUtil.java:97)處使用java.io.ObjectInputStream.readNonProxyDesc處的$ 1.resolveClass(IOUtil.java:113)(ObjectInputStream.java: 1613)在java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518)位於java.io.ObjectInputStream.re位於java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1351)上的java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993) :1918)在java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)在java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)在java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)在玉米.hazelcast.nio.serialization.DefaultSerializers $ ObjectSerializer.read(DefaultSerializers.java:196)at com.hazelcast.nio.serialization.StreamSerializerAdapter.toObject(StreamSerializerAdapter.java:65)at com.hazelcast.nio.serialization.SerializationServiceImpl.toObject (SerializationServiceImpl.java:260)在com.hazelcast.spi.impl.NodeEngineImpl.toObject(NodeEngineImpl.java:186)在com.hazelcast.map.impl.AbstractMa pServiceContextSupport.toObject(AbstractMapServiceContextSupport.java:42)在com.hazelcast.map.impl.DefaultMapServiceContext.toObject(DefaultMapServiceContext.java:28)在com.hazelcast.map.impl.proxy.MapProxySupport.toObject(MapProxySupport.java:1038) at com.hazelcast.map.impl.proxy.MapProxyImpl.get(MapProxyImpl.java:84)

Hazelcast每次對對象進行反序列化時都會加載該類。我不知道爲什麼每次都需要類加載。

有人可以請幫助。

+0

你是如何解決這個問題的? – Dinesh

回答

1

這不是Hazelcast的具體內容,無論何時創建實例,都必須爲該類請求類加載器,而不管是使用反射還是新調用。問題實際上是當同步類加載器進入遊戲時(如在webapps或東西中)。顯然,Hazelcast必須反序列化很多,因此需要很多類。

內部反序列化現在是一種優化(通過緩存conctructor實例 - 據我所知),但Java標準序列化(您使用的)總是希望類和類尚未緩存。

+0

那麼你有什麼建議擺脫這個問題?我已經開始面臨同樣的問題,正如你所提到的,類加載器中有一個同步塊。 – Dinesh

+1

正如我所提到的那樣,這是一個Java問題,並非特定於Hazelcast。您只能破解/包裝ClassLoader並自行實施緩存策略。之後,您將包裝ClassLoader實例作爲配置類加載器傳遞給Hazelcast的配置。 – noctarius

+0

好的。我沒有包裝類加載器,而是複製'ClassLoaderUtil'中的'ConstructorCache'類以創建'ClassCacheMap',它將緩存這些類。後來我看到'Mr.Easy'也對一些PR做了幾乎完全相同的更改,但從未與hz codeline整合過(我認爲)。我希望它能給我一些好的結果。 我即將對修補過的jar進行一些測試。 – Dinesh