内存泄露
将数据写入到了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