2016-04-13 3 views
1

Мне нужно сериализовать множество объектов в моем приложении с помощью Kryo. Некоторые из них представляют собой очень крупные графические объекты, другие - небольшие контейнеры с несколькими примитивами (но есть лот этих контейнеров). Эти процессы сериализации могут происходить в нескольких потоках одновременно (на разных элементах данных).Kryo: IdentityObjectIntMap.clear() производит огромную нагрузку на процессор

Согласно документации:

  1. Kryo экземпляр не поточно.
  2. Создание нового экземпляра Kryo дорого.

Логический вывод для меня был иметь ThreadLocal<WeakReference<Kryo>>, который действует в качестве кэша для инициализированных Kryo экземпляров.

Однако JVisualVM теперь показывает мне, что метод com.esotericsoftware.kryo.util.IdentityObjectIntMap.clear() потребляет 90% времени процессора (моего времени) моего приложения. Для меня это похоже на то, что Крио нужно как-то «перезагрузить» себя между процессами сериализации, и, судя по всему, эта операция довольно дорога.

Кто-нибудь знает, что может происходить здесь, и почему эта операция слишком сильно снижает производительность моего приложения или как я могу сделать лучше, чем с локальным слабым опорным кешем для Kryo экземпляров?

ответ

0

Вы должны использовать пул экземпляров Kryo и перезагружать экземпляр при каждом выпуске экземпляра в пул.

В настоящее время существует официальная реализация пула в Крио, см. KryoPool (начиная с версии v3 afaik) или другие проекты, реализующие эту стратегию.

0

Вы можете использовать Kryo#setReference(false).

С:

Kryo#setReference(true) 

Kryo треков чтения объектов/записи. И внутри, Kryo использует IdentityObjectIntMap для управления объектом чтения/записи.

Kryo#setReference(false) 

прекратит отслеживание чтения/объекты писать, так IdentityObjectIntMap#clear не будет называться больше.

Смежные вопросы