package com.jivesoftware.os.amza.service.filer; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.nio.ByteBuffer; /** * * @author jonathan.colt */ public class DirectBufferCleaner { private static final Class<?> directBufferClass; private static final Method directBufferCleanerMethod; private static final Class<?> cleanerClass; private static final Method cleanMethod; private static final boolean available; static { Class<?> _directBufferClass = null; Method _directBufferCleanerMethod = null; Class<?> _cleanerClass = null; Method _cleanMethod = null; boolean _available = false; try { _directBufferClass = Class.forName("sun.nio.ch.DirectBuffer"); _directBufferCleanerMethod = _directBufferClass.getMethod("cleaner"); _cleanerClass = Class.forName("sun.misc.Cleaner"); _cleanMethod = _cleanerClass.getMethod("clean"); _available = true; } catch (ClassNotFoundException | NoSuchMethodException | SecurityException e) { System.out.println("Failed to reflect direct buffer cleaner, these methods will be unavailable"); e.printStackTrace(); } directBufferClass = _directBufferClass; directBufferCleanerMethod = _directBufferCleanerMethod; cleanerClass = _cleanerClass; cleanMethod = _cleanMethod; available = _available; } static public void clean(ByteBuffer bb) { if (available && cleanMethod != null && directBufferClass.isAssignableFrom(bb.getClass())) { try { Object cleaner = directBufferCleanerMethod.invoke(bb); if (cleaner != null) { cleanMethod.invoke(cleaner); } } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { System.out.println("Failed to clean buffer"); e.printStackTrace(); } } } }