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

qco9c6ql  于 2021-11-27  发布在  Java
关注(0)|答案(10)|浏览(357)

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

z18hc3ub

z18hc3ub1#

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

nwnhqdif

nwnhqdif2#

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

ftf50wuq

ftf50wuq3#

需要example,class,反序列化出来的字符串。看有没有使用动态类型等。
#2081

pu82cl6c

pu82cl6c4#

是不是每次都new ParserConfig了?

0s0u357o

0s0u357o5#

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

dgsult0t

dgsult0t6#

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

72qzrwbm

72qzrwbm8#

是不是每次都new ParserConfig类了?

4jb9z9bj

4jb9z9bj9#

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

vkc1a9a210#

hello,这个问题有解决吗?

相关问题