【发布时间】:2016-04-13 14:44:09
【问题描述】:
我需要在我的应用程序中使用 Kryo 序列化很多对象。其中一些是非常大的对象图,另一些只是带有一些原语的小容器(但这些容器有很多很多)。这些序列化过程可以同时发生在多个线程中(在不同的数据元素上)。
根据文档:
-
Kryo实例不是线程安全的。 - 创建一个新的
Kryo实例的成本很高。
对我来说,合乎逻辑的结论是有一个 ThreadLocal<WeakReference<Kryo>> 充当初始化 Kryo 实例的缓存。
但是,JVisualVM 现在向我显示,com.esotericsoftware.kryo.util.IdentityObjectIntMap.clear() 方法正在消耗我的应用程序 90% 的 CPU 时间(自身时间)。对我来说,这看起来好像 Kryo 需要在序列化过程之间以某种方式“重置”自己,而且显然这个操作相当昂贵。
有没有人知道这里可能发生了什么以及为什么这个操作会使我的应用程序性能下降这么多,或者我如何才能比Kryo 实例的线程本地弱引用缓存做得更好?
【问题讨论】:
标签: java performance serialization concurrency kryo