Skip to content

Commit 4261370

Browse files
MapConverter: cache small builder.
1 parent e12eea8 commit 4261370

File tree

1 file changed

+17
-4
lines changed

1 file changed

+17
-4
lines changed

objectbox-java/src/main/java/io/objectbox/converter/FlexMapConverter.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import java.util.List;
1212
import java.util.Map;
1313
import java.util.Map.Entry;
14+
import java.util.concurrent.atomic.AtomicReference;
1415

1516
/**
1617
* Converts between {@link Map} properties and byte arrays using FlexBuffers.
@@ -23,21 +24,33 @@
2324
*/
2425
public abstract class FlexMapConverter implements PropertyConverter<Map<Object, Object>, byte[]> {
2526

27+
private static final AtomicReference<FlexBuffersBuilder> cachedBuilder = new AtomicReference<>();
28+
2629
@Override
2730
public byte[] convertToDatabaseValue(Map<Object, Object> map) {
2831
if (map == null) return null;
2932

30-
FlexBuffersBuilder builder = new FlexBuffersBuilder(
31-
new ArrayReadWriteBuf(512),
32-
FlexBuffersBuilder.BUILDER_FLAG_SHARE_KEYS_AND_STRINGS
33-
);
33+
FlexBuffersBuilder builder = cachedBuilder.getAndSet(null);
34+
if (builder == null) {
35+
builder = new FlexBuffersBuilder(
36+
new ArrayReadWriteBuf(512),
37+
FlexBuffersBuilder.BUILDER_FLAG_SHARE_KEYS_AND_STRINGS
38+
);
39+
}
3440

3541
addMap(builder, null, map);
3642

3743
ByteBuffer buffer = builder.finish();
3844

3945
byte[] out = new byte[buffer.limit()];
4046
buffer.get(out);
47+
48+
// Cache if builder does not consume too much memory
49+
if (buffer.limit() <= 256 * 1024) {
50+
builder.clear();
51+
cachedBuilder.getAndSet(builder);
52+
}
53+
4154
return out;
4255
}
4356

0 commit comments

Comments
 (0)