boolean (@NotNull ByteBuffer buffer) { if (!buffer.isDirect()) return true; if (invokeCleaner != null) { try { invokeCleaner.invoke(buffer); return true; } catch (Throwable t) { getLogger().warn(t); return false; } } else { //used in Kotlin and JPS try { Class<?> directBufferClass = Class.forName("sun.nio.ch.DirectBuffer"); Class<?> cleanerClass = Class.forName("sun.misc.Cleaner"); Object cleaner = directBufferClass.getDeclaredMethod("cleaner").invoke(buffer); if (cleaner != null) { cleanerClass.getDeclaredMethod("clean").invoke(cleaner); // already cleaned otherwise } return true; } catch (Exception e) { getLogger().warn(e); return false; } } }