From 31e33f6ece523957561c47a69d153b8ea5bb0a97 Mon Sep 17 00:00:00 2001 From: wyxloading Date: Thu, 6 Aug 2020 00:36:02 +0800 Subject: [PATCH] consoleEncoder: put cloned jsonEncoder back to pool (#852) consoleEncoder clone a jsonEncoder in `writeContext`, but never put back to pool after use. This make zap do more memory allocations, and may increase gc time. --- zapcore/console_encoder.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/zapcore/console_encoder.go b/zapcore/console_encoder.go index 54aae7ef9..6c6080366 100644 --- a/zapcore/console_encoder.go +++ b/zapcore/console_encoder.go @@ -130,7 +130,12 @@ func (c consoleEncoder) EncodeEntry(ent Entry, fields []Field) (*buffer.Buffer, func (c consoleEncoder) writeContext(line *buffer.Buffer, extra []Field) { context := c.jsonEncoder.Clone().(*jsonEncoder) - defer context.buf.Free() + defer func() { + // putJSONEncoder assumes the buffer is still used, but we write out the buffer so + // we can free it. + context.buf.Free() + putJSONEncoder(context) + }() addFields(context, extra) context.closeOpenNamespaces()