我需要使用Kryo在我的应用程序中序列化很多对象。其中一些实际上是大型对象图,其他只是具有一些基元的小容器(但是这些容器有批次)。这些序列化过程可以在多个线程中同时发生(在不同的数据元素上)。
根据文件:
Kryo
实例不是线程安全的。Kryo
实例非常昂贵。我的逻辑结论是让ThreadLocal<WeakReference<Kryo>>
充当初始化Kryo
实例的缓存。
但是,JVisualVM现在告诉我方法com.esotericsoftware.kryo.util.IdentityObjectIntMap.clear()
占用了应用程序90%的CPU时间(自身时间)。对我来说,这看起来好像Kryo需要某种方式&#34;重置&#34;它本身就在序列化过程之间,显然这个操作相当昂贵。
有没有人知道这里可能会发生什么以及为什么这个操作会使我的应用程序性能下降如此之多,或者我如何能够为Kryo
个实例的线程局部弱引用缓存做得更好?< / p>
答案 0 :(得分:1)
您可以使用Kryo#setReference(false)
。
使用:
Kryo#setReference(true)
Kryo跟踪读/写对象。
在内部,Kryo使用IdentityObjectIntMap
来管理读/写对象。
Kryo#setReference(false)
将停止跟踪读/写对象,因此将不再调用IdentityObjectIntMap#clear
。
答案 1 :(得分:0)
您应该使用Kryo实例池,并在每次向池中释放实例时重置实例。
Kryo现在有一个官方池实现,请参阅KryoPool(自v3 afaik)或其他实施此策略的项目。