1

概要分析

主要每个ObjectMapper实例对象会维护一个序列化器缓存,即_rootDeserializers成员变量,这是一个ConcurrentHashMap。
image.png

readValues()的时候,会调用_findRootDeserializer()查找json序列化器。
image.png

如果_rootDeserializers中没有获取到,会调用com.fasterxml.jackson.databind.deser.DeserializerCache#findValueDeserializer进行获取。
image.png

DeserializerCache中也会有一个序列化器缓存叫_cachedDeserializers,这是个LRU map。
image.png

如果在_cachedDeserializers中获取不到,就要新建一个序列化器了。
image.png

这个就恼火了,会频繁的尝试类加载,方法调用轨迹如下:
ObjectMapper初始化.png

结论

  因此,如果每次都新建一个ObjectMapper实例,那么每次都需要重新创建json序列化器,会导致严重的类加载操作。

  • 尽量复用ObjectMapper实例对象【当然是线程安全的】

开翻挖掘机
225 声望26 粉丝

不忘初心❤️,且行且思考