diff --git a/commons/src/main/java/org/archive/bdb/KryoBinding.java b/commons/src/main/java/org/archive/bdb/KryoBinding.java index e9202d46..70002973 100644 --- a/commons/src/main/java/org/archive/bdb/KryoBinding.java +++ b/commons/src/main/java/org/archive/bdb/KryoBinding.java @@ -18,6 +18,8 @@ */ package org.archive.bdb; +import java.lang.ref.WeakReference; + import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.ObjectBuffer; import com.sleepycat.bind.EntryBinding; @@ -33,10 +35,10 @@ public class KryoBinding implements EntryBinding { protected Class baseClass; protected AutoKryo kryo = new AutoKryo(); - protected ThreadLocal threadBuffer = new ThreadLocal() { + protected ThreadLocal> threadBuffer = new ThreadLocal>() { @Override - protected ObjectBuffer initialValue() { - return new ObjectBuffer(kryo,16*1024,Integer.MAX_VALUE); + protected WeakReference initialValue() { + return new WeakReference(new ObjectBuffer(kryo,16*1024,Integer.MAX_VALUE)); } }; @@ -61,17 +63,27 @@ public class KryoBinding implements EntryBinding { return kryo; } + private ObjectBuffer getBuffer() { + WeakReference ref = threadBuffer.get(); + ObjectBuffer ob = ref.get(); + if (ob == null) { + ob = new ObjectBuffer(kryo,16*1024,Integer.MAX_VALUE); + threadBuffer.set(new WeakReference(ob)); + } + return ob; + } + /** * Copies superclass simply to allow different source for FastOoutputStream. * * @see com.sleepycat.bind.serial.SerialBinding#entryToObject */ public void objectToEntry(K object, DatabaseEntry entry) { - entry.setData(threadBuffer.get().writeObjectData(object)); + entry.setData(getBuffer().writeObjectData(object)); } @Override public K entryToObject(DatabaseEntry entry) { - return threadBuffer.get().readObjectData(entry.getData(), baseClass); + return getBuffer().readObjectData(entry.getData(), baseClass); } }