我需要使用 Kryo 序列化应用程序中的许多对象。其中一些是非常大的对象图,其他的只是带有一些原语的小容器(但这些容器有很多)。这些序列化过程可以在多个线程中同时发生(在不同的数据元素上)。
根据文档:
- 一个
Kryo
实例不是线程安全的。 - 创建新的
Kryo
实例很昂贵。
对我来说合乎逻辑的结论是 ThreadLocal<WeakReference<Kryo>>
充当初始化 Kryo
的缓存实例。
但是,JVisualVM 现在向我展示了方法 com.esotericsoftware.kryo.util.IdentityObjectIntMap.clear()
消耗了我的应用程序 90% 的 CPU 时间(自身时间)。对我来说,这看起来好像 Kryo 需要在序列化过程之间以某种方式“重置”自身,而且显然这个操作相当昂贵。
有谁知道这里可能发生了什么以及为什么此操作使我的应用程序性能下降如此之多,或者我如何才能比使用 Kryo
的线程本地弱引用缓存做得更好实例?
最佳答案
您可以使用Kryo#setReference(false)
。
与:
Kryo#setReference(true)
Kryo 跟踪读/写对象。
在内部,Kryo 使用 IdentityObjectIntMap
来管理读/写对象。
Kryo#setReference(false)
将停止跟踪读/写对象,因此将不再调用IdentityObjectIntMap#clear
。
关于java - Kryo:IdentityObjectIntMap.clear() 产生巨大的 CPU 负载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36601953/