diff --git a/atlasdb-client/src/main/java/com/palantir/atlasdb/persister/JacksonPersister.java b/atlasdb-client/src/main/java/com/palantir/atlasdb/persister/JacksonPersister.java index f1a1118d07e..adc75007f73 100644 --- a/atlasdb-client/src/main/java/com/palantir/atlasdb/persister/JacksonPersister.java +++ b/atlasdb-client/src/main/java/com/palantir/atlasdb/persister/JacksonPersister.java @@ -19,7 +19,10 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.base.Throwables; import com.palantir.atlasdb.persist.api.ReusablePersister; +import java.io.ByteArrayInputStream; import java.io.IOException; +import java.io.StringReader; +import java.nio.charset.StandardCharsets; /** * A {@link ReusablePersister} that uses an {@link ObjectMapper} to serialize and deserialize objects @@ -38,7 +41,14 @@ public JacksonPersister(Class typeRef, ObjectMapper mapper) { @Override public final T hydrateFromBytes(byte[] input) { try { - return mapper.readValue(input, typeRef); + if (input.length <= 8192 && mapper.getFactory().canUseCharArrays()) { + // Optimize to avoid allocation of heap ByteBuffer via InputStreamReader. + // Remove after upgrade to Jackson 2.16. + // see: https://github.com/FasterXML/jackson-core/pull/1081 + // and https://github.com/FasterXML/jackson-benchmarks/pull/9 + return mapper.readValue(new StringReader(new String(input, StandardCharsets.UTF_8)), typeRef); + } + return mapper.readValue(new ByteArrayInputStream(input), typeRef); } catch (IOException e) { throw Throwables.propagate(e); } diff --git a/changelog/@unreleased/pr-6750.v2.yml b/changelog/@unreleased/pr-6750.v2.yml new file mode 100644 index 00000000000..29627c424be --- /dev/null +++ b/changelog/@unreleased/pr-6750.v2.yml @@ -0,0 +1,8 @@ +type: improvement +improvement: + description: |- + Optimize to avoid allocation of heap ByteBuffer via InputStreamReader. Remove after upgrade to Jackson 2.16. + + see: https://github.com/FasterXML/jackson-core/pull/1081 and https://github.com/FasterXML/jackson-benchmarks/pull/9 + links: + - https://github.com/palantir/atlasdb/pull/6750