diff --git a/common/kvstore/src/main/java/org/apache/spark/util/kvstore/LevelDB.java b/common/kvstore/src/main/java/org/apache/spark/util/kvstore/LevelDB.java index 121dfbd4f6..6b28373a48 100644 --- a/common/kvstore/src/main/java/org/apache/spark/util/kvstore/LevelDB.java +++ b/common/kvstore/src/main/java/org/apache/spark/util/kvstore/LevelDB.java @@ -19,7 +19,8 @@ package org.apache.spark.util.kvstore; import java.io.File; import java.io.IOException; -import java.lang.ref.SoftReference; +import java.lang.ref.Reference; +import java.lang.ref.WeakReference; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; @@ -69,10 +70,10 @@ public class LevelDB implements KVStore { /** * Trying to close a JNI LevelDB handle with a closed DB causes JVM crashes. This is used to - * ensure that all iterators are correctly closed before LevelDB is closed. Use soft reference + * ensure that all iterators are correctly closed before LevelDB is closed. Use weak references * to ensure that the iterator can be GCed, when it is only referenced here. */ - private final ConcurrentLinkedQueue>> iteratorTracker; + private final ConcurrentLinkedQueue>> iteratorTracker; public LevelDB(File path) throws Exception { this(path, new KVStoreSerializer()); @@ -250,7 +251,7 @@ public class LevelDB implements KVStore { public Iterator iterator() { try { LevelDBIterator it = new LevelDBIterator<>(type, LevelDB.this, this); - iteratorTracker.add(new SoftReference<>(it)); + iteratorTracker.add(new WeakReference<>(it)); return it; } catch (Exception e) { throw Throwables.propagate(e); @@ -301,7 +302,7 @@ public class LevelDB implements KVStore { try { if (iteratorTracker != null) { - for (SoftReference> ref: iteratorTracker) { + for (Reference> ref: iteratorTracker) { LevelDBIterator it = ref.get(); if (it != null) { it.close();