2016-04-13 5 views
1

Ich muss viele Objekte in meiner Anwendung mit Kryo serialisieren. Einige von ihnen sind wirklich große Objektgraphen, andere sind nur kleine Container mit ein paar Primitiven (aber es gibt eine Los dieser Container). Diese Serialisierungsprozesse können gleichzeitig in mehreren Threads (auf verschiedenen Datenelementen) stattfinden.Kryo: IdentityObjectIntMap.clear() produziert enorme CPU-Last

Nach der Dokumentation:

  1. A Kryo Instanz Gewinde ist nicht sicher.
  2. Erstellen einer neuen Kryo Instanz ist teuer.

Die logische Schlussfolgerung war für mich ein ThreadLocal<WeakReference<Kryo>>, die für initialisiert Kryo Instanzen als Cache fungiert zu haben.

JVisualVM zeigt mir nun, dass die Methode com.esotericsoftware.kryo.util.IdentityObjectIntMap.clear() 90% der CPU-Zeit (Eigenzeit) meiner Anwendung verbraucht. Für mich sieht das so aus, als müsste Kryo sich zwischen Serialisierungsvorgängen irgendwie "zurücksetzen", und diese Operation ist offensichtlich ziemlich teuer.

Hat jemand eine Ahnung, was hier vor sich geht und warum diese Operation meine Anwendungsleistung so stark nach unten bringt, oder wie kann ich besser als mit einem thread-lokalen schwachen Referenz-Cache für Kryo Instanzen?

Antwort

0

Sie sollten einen Pool von Kryo-Instanzen verwenden und die Instanz jedes Mal zurücksetzen, wenn Sie eine Instanz im Pool freigeben.

Es gibt jetzt eine offizielle Pool-Implementierung in Kryo, siehe KryoPool (seit v3 afaik), oder andere Projekte, die diese Strategie implementieren.

0

Sie können verwenden.

mit:

Kryo#setReference(true) 

Kryo Spuren Lese-/Schreib Objekte. Und intern verwendet Kryo IdentityObjectIntMap, um Lese-/Schreibobjekte zu verwalten.

Kryo#setReference(false) 

stoppen Tracking-Lese-/Schreib-Objekte, so IdentityObjectIntMap#clear wird nicht mehr aufgerufen werden.