私のアプリケーションでは、Kryoで多くのオブジェクトを直列化する必要があります。それらのうちのいくつかは本当に大きなオブジェクトグラフであり、その他はいくつかのプリミティブを持つ小さなコンテナです(しかし、これらのコンテナのがです)。これらのシリアライゼーションプロセスは、複数のスレッドで(異なるデータ要素上で)同時に発生する可能性があります。Kryo:IdentityObjectIntMap.clear()は非常に大きなCPU負荷を発生します
ドキュメントによると:
Kryo
インスタンスはスレッドセーフではありません。- 新しい
Kryo
インスタンスを作成するには高価です。
私にとって論理的な結論は、Kryo
インスタンスのキャッシュとして機能するThreadLocal<WeakReference<Kryo>>
を持つことでした。
しかし、JVisualVMでは、com.esotericsoftware.kryo.util.IdentityObjectIntMap.clear()
というメソッドがアプリケーションのCPU時間(自己時間)の90%を消費していることがわかりました。私にとって、これは、Kryoがシリアル化プロセスの間に何らかの形で「リセット」する必要があるかのように見えます。明らかに、この操作はかなり高価です。
ここで何が起こっているのか、そしてなぜこの操作でアプリケーションのパフォーマンスが低下するのか、あるいはKryo
インスタンスのスレッドローカル弱参照キャッシュよりもうまくいくのかどうかは誰にも分かりませんか?