fastjson icon indicating copy to clipboard operation
fastjson copied to clipboard

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

Open L-Angel opened this issue 7 years ago • 19 comments

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

L-Angel avatar Oct 29 '18 06:10 L-Angel

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

Ah39 avatar Oct 29 '18 08:10 Ah39

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

L-Angel avatar Oct 29 '18 09:10 L-Angel

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

Ah39 avatar Oct 29 '18 12:10 Ah39

是不是每次都new ParserConfig了?

wenshao avatar Nov 01 '18 12:11 wenshao

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

L-Angel avatar Nov 02 '18 17:11 L-Angel

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

Ah39 avatar Nov 05 '18 02:11 Ah39

是否已修复?

howard-huang avatar Dec 24 '18 07:12 howard-huang

是不是每次都new ParserConfig类了?

wenshao avatar Apr 10 '19 03:04 wenshao

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

mywebcnt avatar Dec 03 '19 13:12 mywebcnt

hello,这个问题有解决吗?

BookLsr avatar Sep 11 '20 03:09 BookLsr

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

robin977 avatar Jun 21 '23 07:06 robin977

换类库吧,官方没解决

fzwjava855 avatar Jun 21 '23 08:06 fzwjava855

这个是很久之前我提的问题了好像,方法是禁用asm 就可以了,不知道最新版本有没有改好

---原始邮件--- 发件人: @.> 发送时间: 2023年6月21日(周三) 下午4:34 收件人: @.>; 抄送: @.@.>; 主题: Re: [alibaba/fastjson] 反序列化产生大量字节码,导致MetaSpace区溢出,引发FullGc (#2109)

换类库吧,官方没解决

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you commented.Message ID: @.***>

mywebcnt avatar Jun 21 '23 08:06 mywebcnt

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

fzwjava855 avatar Jun 21 '23 09:06 fzwjava855

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

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

luoxiaoge avatar Sep 18 '23 08:09 luoxiaoge

https://www.ibm.com/support/pages/potential-native-memory-use-reflection-delegating-classloaders 可以牺牲一点性能, 把inflation阈值调一下, 应该有帮助

liaoshuguang avatar Dec 27 '23 03:12 liaoshuguang

ok。已收到谢谢

luoxiaoge avatar Dec 27 '23 03:12 luoxiaoge

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

@wenshao 这个哪个版本修复了

matthewZZC avatar Feb 21 '24 07:02 matthewZZC

ok。已收到谢谢

luoxiaoge avatar Feb 21 '24 07:02 luoxiaoge