diff -r 46492a773912 -r 106dc156ce6b src/java.base/share/classes/sun/nio/ch/Util.java --- a/src/java.base/share/classes/sun/nio/ch/Util.java Fri Jun 22 21:42:00 2018 +0800 +++ b/src/java.base/share/classes/sun/nio/ch/Util.java Fri Jun 22 17:56:55 2018 +0200 @@ -26,6 +26,7 @@ package sun.nio.ch; import java.io.FileDescriptor; +import java.io.IOException; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.nio.ByteBuffer; @@ -35,9 +36,10 @@ import java.util.Collection; import java.util.Iterator; import java.util.Set; + +import jdk.internal.misc.TerminatingThreadLocal; import jdk.internal.misc.Unsafe; import sun.security.action.GetPropertyAction; -import java.io.IOException; public class Util { @@ -50,13 +52,18 @@ private static final long MAX_CACHED_BUFFER_SIZE = getMaxCachedBufferSize(); // Per-thread cache of temporary direct buffers - private static ThreadLocal bufferCache = - new ThreadLocal() - { + private static ThreadLocal bufferCache = new TerminatingThreadLocal<>() { @Override protected BufferCache initialValue() { return new BufferCache(); } + @Override + protected void threadTerminated(BufferCache cache) { // will never be null + while (!cache.isEmpty()) { + ByteBuffer bb = cache.removeFirst(); + free(bb); + } + } }; /**