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

内存泄露

将数据写入到了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

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
`JSON.toJSONString()` 是 Java 用于将对象转换为 JSON 字符串的方法。它属于 `com.alibaba.fastjson.JSON` 类的一个静态方法。 以下是 `JSON.toJSONString()` 方法的功能和用法: 1. 将 Java 对象转换为 JSON 字符串:`JSON.toJSONString(Object object)` - 该方法将给定的 Java 对象转换为对应的 JSON 字符串表示形式。 - 例如:`String jsonString = JSON.toJSONString(student);` 2. 设置序列化选项:`JSON.toJSONString(Object object, SerializerFeature... features)` - 该方法可以通过传递一个或多个 `SerializerFeature` 枚举值作为参数,来设置序列化选项。 - 例如:`String jsonString = JSON.toJSONString(student, SerializerFeature.WriteDateUseDateFormat);` 3. 序列化集合类型:`JSON.toJSONString(Collection<?> collection)` - 该方法可以将 Java 集合类型(如 List、Set)转换为对应的 JSON 字符串表示形式。 - 例如:`String jsonString = JSON.toJSONString(studentList);` 4. 序列化数组类型:`JSON.toJSONString(Object[] array)` - 该方法可以将 Java 数组类型转换为对应的 JSON 字符串表示形式。 - 例如:`String jsonString = JSON.toJSONString(studentArray);` 5. 序列化 Map 类型:`JSON.toJSONString(Map<?, ?> map)` - 该方法可以将 Java Map 类型转换为对应的 JSON 字符串表示形式。 - 例如:`String jsonString = JSON.toJSONString(studentMap);` 需要注意的是,在使用 `JSON.toJSONString()` 方法之前,需要在项目引入 FastJson 库的依赖。 希望这能帮到你!如果你还有其他问题,请随时问我。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值