[alibaba/fastjson]反序列化产生大量字节码,导致MetaSpace区溢出,引发FullGc

2025-11-03 532 views
6

发现fastjson在反序列化的时候会加载在大量的字节码信息,导致MetaSpace区溢出引发FullGc,

回答

8

jdk 版本,方序列化的example 有吗? 使用的api。fastjson版本

0

JSON.parseObject(xxx, xxx.class); JDK:1.8 fastjson:1.3.21

7

需要example,class,反序列化出来的字符串。看有没有使用动态类型等。 https://github.com/alibaba/fastjson/issues/2081

0

是不是每次都new ParserConfig了?

0

没有,直接使用的JSON.parseObject(xxx, xxx.class)这个方法,打印了下加载的类信息,好多asm生成的类

7

有例子吗?class 和json string,或者直接可以复现的单元测试。这么讨论,不会有结论的

6

是否已修复?

0

是不是每次都new ParserConfig类了?

6

也发生了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;
0

hello,这个问题有解决吗?

0

是的,在高并发情况下,SerializeConfig的getObjectWriter方法,并不是线程安全的

3

换类库吧,官方没解决

7

换类库吧,官方没解决

2

没解决,没解决,一个需要转json的类一个jar,它底层机制就这样,类多了MetaSpace可能会溢出,取决于你类的数量,换掉它

2

也发生了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;

也遇到同样的,问题请问怎么解决的?