diff --git a/common/src/main/java/io/netty/util/internal/Cleaner0.java b/common/src/main/java/io/netty/util/internal/Cleaner0.java index e4a7188b02..ab1fc2f779 100644 --- a/common/src/main/java/io/netty/util/internal/Cleaner0.java +++ b/common/src/main/java/io/netty/util/internal/Cleaner0.java @@ -43,9 +43,15 @@ final class Cleaner0 { try { cleanerField = direct.getClass().getDeclaredField("cleaner"); cleanerField.setAccessible(true); - Object cleaner = cleanerField.get(direct); fieldOffset = PlatformDependent0.objectFieldOffset(cleanerField); - clean = cleaner.getClass().getDeclaredMethod("clean"); + Object cleaner = cleanerField.get(direct); + try { + // Cleaner implements Runnable from JDK9 onwards. + Runnable runnable = (Runnable) cleaner; + clean = Runnable.class.getDeclaredMethod("run"); + } catch (ClassCastException ignored) { + clean = cleaner.getClass().getDeclaredMethod("clean"); + } clean.invoke(cleaner); } catch (Throwable t) { // We don't have ByteBuffer.cleaner(). diff --git a/common/src/main/java/io/netty/util/internal/PlatformDependent0.java b/common/src/main/java/io/netty/util/internal/PlatformDependent0.java index c572212ed9..3f0cd49ca0 100644 --- a/common/src/main/java/io/netty/util/internal/PlatformDependent0.java +++ b/common/src/main/java/io/netty/util/internal/PlatformDependent0.java @@ -154,6 +154,8 @@ final class PlatformDependent0 { logger.debug("java.nio.DirectByteBuffer.(long, int): {}", DIRECT_BUFFER_CONSTRUCTOR != null? "available" : "unavailable"); + + freeDirectBuffer(direct); } static boolean isUnaligned() {