当前位置: 首页 > 后端技术 > Java

JacksonObjectMapper重用的根本原因

时间:2023-04-01 16:21:02 Java

总结分析主要是每个ObjectMapper实例对象都会维护一个serializer缓存,即_rootDeserializers成员变量,它是一个ConcurrentHashMap。在readValues()中调用_findRootDeserializer()寻找json序列化器。如果在_rootDeserializers中没有获取到,则会调用com.fasterxml.jackson.databind.deser.DeserializerCache#findValueDeserializer获取。DeserializerCache中还会有一个serializercache叫做_cachedDeserializers,它是一个LRUmap。如果在_cachedDeserializers中获取不到,则需要新建一个serializer。这很烦人,而且会频繁尝试类加载,方法调用trace如下:结论因此,如果每次都创建ObjectMapper实例,每次都需要重新创建json序列化器,会导致严重的类加载操作。尽量复用ObjectMapper实例对象【当然是线程安全的】。