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:
- A
Kryo
Instanz Gewinde ist nicht sicher. - 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?