当使用com.alibaba.fastjson.JSON:public static <T> T parseObject(byte[] bytes, Type clazz, Feature... features) 这个API,当传入的Type为ParameterizedTypeImpl类型时候,发生内存泄漏。
下面是我的代码:
UserInfo userInfo=new UserInfo();
userInfo.setName("zyr");
userInfo.setPassword("123");
WrapReturn wrapReturn = new WrapReturn();
wrapReturn.setResult(userInfo);
byte[] bytes = JSON.toJSONBytes(new WrapReturn(userInfo));
while (true){
Object o = JSON.parseObject(bytes, new ParameterizedTypeImpl(new Type[]{UserInfo.class}, null, WrapReturn.class));
}
指定堆大小为100MB,运行一段时候后,出现OOM。
查看代码,发现关键调用是:com.alibaba.fastjson.parser.ParserConfig :public ObjectDeserializer getDeserializer(Type type)
public ObjectDeserializer getDeserializer(Class<?> clazz, Type type) {
ObjectDeserializer derializer = deserializers.get(type);
if (derializer != null) {
return derializer;
}
........
........
........
putDeserializer(type, derializer);
return derializer;
deserializers这个变量是一个IdentityHashMap实例,该实例并未采用hashCode来定位bucket,而采用System.identityHashCode来。所以产生上述问题。
虽然,我们多次new ParameterizedTypeImpl实例,但是这些实例都是表示同一个泛型化类型,所以在逻辑上都是相等的。那么出现上述的问题,应该是不合理的。
出现这个问题,是BUG还是使用上不规范?