我们有这样的需求,在一个组件中,将泛型转为一种自定义的中间类型:JavaType,目的是提供抽象的数据转换器。
该组件默认提供的json转换器有gson、jackson两种。
有其它项目使用这个基础组件,但这些项目有的是用的自己实现的数据转换器,使用的是fastjson,这些项目运行一段时间后出现oom。我们发现是因为每次反序列化时,都创建一个java.lang.reflect.ParameterizedType导致的。
排查原因发现,gson与jackson两种工具在缓存实现上都实现了equals,而fastjson相当于是使用==。
gson缓存key比较使用了equals,实现如下:
@Override public final boolean equals(Object o) {
return o instanceof TypeToken<?>
&& $Gson$Types.equals(type, ((TypeToken<?>) o).type);
}
而fastjson没有使用equals:
写:
this.deserializers.put(java.lang.reflect.type, deserializer);
读:
return (ObjectDeserializer)this.deserializers.get(java.lang.reflect.type);
因此提下建议,是否改为equals更合适?
暂无答案!
目前还没有任何答案,快来回答吧!