java - Kryo:IdentityObjectIntMap.clear() 产生巨大的 CPU 负载

标签 java performance serialization concurrency kryo

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

根据文档:

  1. 一个Kryo实例不是线程安全的。
  2. 创建新的 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/

相关文章:

sql - MS Access 查询的性能

java - 为什么 java 收集流对每个 getter 运行两次?

java - java序列化的内部原理: Which class initiates Serialization process?

java - 使用 Simple 将 HashMap 序列化为根元素

serialization - 如何将 AVRO 序列化器与 Kafka Connect SourceTask 中的架构注册表结合使用

java - 图像上弹出文本的 CSS 帮助

c# - 从java到c#的base64编码和解码问题

java - 如何使用ANT脚本检查JBOSS版本

java - 我收到 StaleElementReferenceException : element is not attached to the page document

javascript - 降低 Javascript 中 DOM 搜索频率