--- old/src/java.base/share/classes/java/nio/Bits.java 2016-02-16 16:37:13.094840640 +0100 +++ new/src/java.base/share/classes/java/nio/Bits.java 2016-02-16 16:37:13.012840159 +0100 @@ -32,6 +32,8 @@ import jdk.internal.misc.SharedSecrets; import jdk.internal.misc.Unsafe; import jdk.internal.misc.VM; +import jdk.internal.ref.CleanerFactory; +import jdk.internal.ref.CleanerImpl; /** * Access to bits, native and otherwise. @@ -626,10 +628,12 @@ final JavaLangRefAccess jlra = SharedSecrets.getJavaLangRefAccess(); - // retry while helping enqueue pending Reference objects - // which includes executing pending Cleaner(s) which includes - // Cleaner(s) that free direct buffer memory - while (jlra.tryHandlePendingReference()) { + // retry while: + // - helping enqueue pending Reference objects which includes Cleanable(s) + // - helping processing the queue of Cleanable(s) which includes the ones + // that free direct buffer memory + while (jlra.tryHandlePendingReference() | // use non-short-circuit or + CleanerImpl.getCleanerImpl(CleanerFactory.cleaner()).drainQueue()) { if (tryReserveMemory(size, cap)) { return; } @@ -651,7 +655,8 @@ if (sleeps >= MAX_SLEEPS) { break; } - if (!jlra.tryHandlePendingReference()) { + if (!jlra.tryHandlePendingReference() & // use non-short-circuit and + !CleanerImpl.getCleanerImpl(CleanerFactory.cleaner()).drainQueue()) { try { Thread.sleep(sleepTime); sleepTime <<= 1;