【发布时间】:2019-07-03 04:10:29
【问题描述】:
考虑以下设置
prop.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, ThriftSerializer.class.getName());
public class ThriftSerializer implements Serializer<TBase> {
private final ThreadLocal<TSerializer> serializer = new ThreadLocalTSerializer();
@Override
public void configure(Map map, boolean b) {
}
@Override
public byte[] serialize(String s, TBase event) {
try {
return serializer.get().serialize(event);
} catch (TException e) {
return new byte[0];
}
}
@Override
public void close() {
}
}
以上代码导致内存泄漏
但我不明白为什么会这样。 kafka producer 会创建很多不死的线程吗?
如果上面的代码被替换为
@Override
public byte[] serialize(String s, TBase event) {
TSerializer serializer = new TSerializer();
try {
return serializer.serialize(event);
} catch (TException e) {
return new byte[0];
}
}
然后内存泄漏消失了,这是有道理的,但是对于每个事件,它都会创建需要进行垃圾收集的新对象,如果吞吐量很高,可能会导致 gc 压力
有人可以指出我理解这种行为的方向吗?
【问题讨论】:
标签: java multithreading apache-kafka thread-safety