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

2025-11-03 371 views
9

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

回答

8

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

5

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

4

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

0

是不是每次都new ParserConfig了?

7

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

2

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

3

是否已修复?

6

是不是每次都new ParserConfig类了?

4

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

hello,这个问题有解决吗?

7

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

5

换类库吧,官方没解决

8

换类库吧,官方没解决

3

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

9

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

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