fastjson中JSON.toJSONString内存泄露如何解决

2022-06-23 08:16:11

内存泄露

将数据写入到了Tomcat线程池管理的线程中

产生原因

public static String toJSONString(Object object, // 
                                      SerializeConfig config, // 
                                      SerializeFilter[] filters, // 
                                      String dateFormat, //
                                      int defaultFeatures, // 
                                      SerializerFeature... features) {
        SerializeWriter out = new SerializeWriter(null, defaultFeatures, features);

        try {
            JSONSerializer serializer = new JSONSerializer(out, config);
            
            if (dateFormat != null && dateFormat.length() != 0) {
                serializer.setDateFormat(dateFormat);
                serializer.config(SerializerFeature.WriteDateUseDateFormat, true);
            }

            if (filters != null) {
                for (SerializeFilter filter : filters) {
                    serializer.addFilter(filter);
                }
            }

            serializer.write(object);

            return out.toString();
        } finally {
            //泄露的地方
            //将buf中的json字符串放入到threadLocal
            out.close();
        }
    }

进入这个方法,仔细看一下

public void close() {
        if (writer != null && count > 0) {
            flush();
        }
        //解决方案就从这个地方下手
        if (buf.length <= BUFFER_THRESHOLD) {
            bufLocal.set(buf);
        }

        this.buf = null;
    }

解决方案

A

不再使用fastjson

B

调整BUFFER_THRESHOLD参数

如何调整

public static void main(String[] args) {
        //在启动类上加入该参数,进行修改
        System.setProperty("fastjson.serializer_buffer_threshold","64");
        SpringApplication.run(SpringbootDemoApplication.class, args);


    }

为什么这样调整会起作用

这个值不可以设置的小于64,也不可以大于1024*64,否则都不会起作用

 而我们的目的是控制BUFFER_THRESHOLD,进行影响buf,为的就是不让buf写入threadLocal,或者尽可能少的写入threadLocal

  • 作者:微信号dafiner
  • 原文链接:https://blog.csdn.net/weixin_39394909/article/details/109124784
    更新时间:2022-06-23 08:16:11