发现fastjson在反序列化的时候会加载在大量的字节码信息,导致MetaSpace区溢出引发FullGc,
[alibaba/fastjson]反序列化产生大量字节码,导致MetaSpace区溢出,引发FullGc
回答
jdk 版本,方序列化的example 有吗? 使用的api。fastjson版本
JSON.parseObject(xxx, xxx.class); JDK:1.8 fastjson:1.3.21
需要example,class,反序列化出来的字符串。看有没有使用动态类型等。 https://github.com/alibaba/fastjson/issues/2081
是不是每次都new ParserConfig了?
没有,直接使用的JSON.parseObject(xxx, xxx.class)这个方法,打印了下加载的类信息,好多asm生成的类
有例子吗?class 和json string,或者直接可以复现的单元测试。这么讨论,不会有结论的
是否已修复?
是不是每次都new ParserConfig类了?
也发生了fullgc 了, ParserConfig没有创建多个,
测试发现, 多线程下高并发下(JSONObject.toJavaObject 方法) ASMDeserializerFactory.createJavaBeanDeserializer 中的 seed 会自增, 导致 MetaSpace 溢出
public ObjectDeserializer createJavaBeanDeserializer(ParserConfig config, JavaBeanInfo beanInfo) throws Exception {
Class<?> clazz = beanInfo.clazz;
if (clazz.isPrimitive()) {
throw new IllegalArgumentException("not support type :" + clazz.getName());
}
String className = "FastjsonASMDeserializer_" + seed.incrementAndGet() + "_" + clazz.getSimpleName();
String classNameType;
String classNameFull;
hello,这个问题有解决吗?
是的,在高并发情况下,SerializeConfig的getObjectWriter方法,并不是线程安全的
换类库吧,官方没解决
换类库吧,官方没解决
没解决,没解决,一个需要转json的类一个jar,它底层机制就这样,类多了MetaSpace可能会溢出,取决于你类的数量,换掉它
也发生了fullgc 了, ParserConfig没有创建多个,
测试发现, 多线程下高并发下(JSONObject.toJavaObject 方法) ASMDeserializerFactory.createJavaBeanDeserializer 中的 seed 会自增, 导致 MetaSpace 溢出
public ObjectDeserializer createJavaBeanDeserializer(ParserConfig config, JavaBeanInfo beanInfo) throws Exception {
Class<?> clazz = beanInfo.clazz;
if (clazz.isPrimitive()) {
throw new IllegalArgumentException("not support type :" + clazz.getName());
}
String className = "FastjsonASMDeserializer_" + seed.incrementAndGet() + "_" + clazz.getSimpleName();
String classNameType;
String classNameFull;
也遇到同样的,问题请问怎么解决的?