【问题标题】:Kryo: IdentityObjectIntMap.clear() produces enormous CPU loadKryo:IdentityObjectIntMap.clear() 会产生巨大的 CPU 负载
【发布时间】:2016-04-13 14:44:09
【问题描述】:

我需要在我的应用程序中使用 Kryo 序列化很多对象。其中一些是非常大的对象图,另一些只是带有一些原语的小容器(但这些容器有很多很多)。这些序列化过程可以同时发生在多个线程中(在不同的数据元素上)。

根据文档:

  1. Kryo 实例不是线程安全的。
  2. 创建一个新的Kryo 实例的成本很高。

对我来说,合乎逻辑的结论是有一个 ThreadLocal<WeakReference<Kryo>> 充当初始化 Kryo 实例的缓存。

但是,JVisualVM 现在向我显示,com.esotericsoftware.kryo.util.IdentityObjectIntMap.clear() 方法正在消耗我的应用程序 90% 的 CPU 时间(自身时间)。对我来说,这看起来好像 Kryo 需要在序列化过程之间以某种方式“重置”自己,而且显然这个操作相当昂贵。

有没有人知道这里可能发生了什么以及为什么这个操作会使我的应用程序性能下降这么多,或者我如何才能比Kryo 实例的线程本地弱引用缓存做得更好?

【问题讨论】:

    标签: java performance serialization concurrency kryo


    【解决方案1】:

    您可以使用Kryo#setReference(false)

    与:

    Kryo#setReference(true)
    

    Kryo 跟踪读/写对象。 在内部,Kryo 使用IdentityObjectIntMap 来管理读/写对象。

    Kryo#setReference(false)
    

    将停止跟踪读/写对象,因此不会再调用IdentityObjectIntMap#clear

    【讨论】:

      【解决方案2】:

      您应该使用 Kryo 实例池,并在每次将实例释放到池中时重置实例。

      现在在 Kryo 中有一个官方的池实施,请参阅 KryoPool(自 v3 afaik 起),或实施此策略的其他项目。

      【讨论】:

        猜你喜欢
        • 2015-08-09
        • 1970-01-01
        • 2010-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多