CleanerJava6 Class — netty Architecture
Architecture documentation for the CleanerJava6 class in CleanerJava6.java from the netty codebase.
Entity Profile
Dependency Diagram
graph TD 1564949e_7b20_a607_8b35_54b91bcfcece["CleanerJava6"] 1313fbb4_7691_cc11_ef24_993589287c1d["CleanerJava6.java"] 1564949e_7b20_a607_8b35_54b91bcfcece -->|defined in| 1313fbb4_7691_cc11_ef24_993589287c1d 17626e33_5ee6_5132_a2dd_7696ba0280af["isSupported()"] 1564949e_7b20_a607_8b35_54b91bcfcece -->|method| 17626e33_5ee6_5132_a2dd_7696ba0280af fd9c73ce_3ed7_14a1_93a9_d0928cad6b59["CleanableDirectBuffer()"] 1564949e_7b20_a607_8b35_54b91bcfcece -->|method| fd9c73ce_3ed7_14a1_93a9_d0928cad6b59 7a35b26c_a314_57c4_a25b_7bd583e69091["freeDirectBuffer()"] 1564949e_7b20_a607_8b35_54b91bcfcece -->|method| 7a35b26c_a314_57c4_a25b_7bd583e69091 982894c8_322b_1556_6f75_75e35426ea7a["freeDirectBufferStatic()"] 1564949e_7b20_a607_8b35_54b91bcfcece -->|method| 982894c8_322b_1556_6f75_75e35426ea7a 1ba54708_ba19_1616_dd30_41ba2b85f301["freeDirectBufferPrivileged()"] 1564949e_7b20_a607_8b35_54b91bcfcece -->|method| 1ba54708_ba19_1616_dd30_41ba2b85f301 64a7314f_e672_b2e8_8c8b_dbb105cac971["freeDirectBuffer0()"] 1564949e_7b20_a607_8b35_54b91bcfcece -->|method| 64a7314f_e672_b2e8_8c8b_dbb105cac971
Relationship Graph
Source Code
common/src/main/java/io/netty/util/internal/CleanerJava6.java lines 36–166
final class CleanerJava6 implements Cleaner {
private static final MethodHandle CLEAN_METHOD;
private static final InternalLogger logger = InternalLoggerFactory.getInstance(CleanerJava6.class);
static {
MethodHandle clean;
Throwable error = null;
final ByteBuffer direct = ByteBuffer.allocateDirect(1);
try {
Object mayBeCleanerField = AccessController.doPrivileged(new PrivilegedAction<Object>() {
@Override
public Object run() {
try {
Class<?> cleanerClass = Class.forName("sun.misc.Cleaner");
Class<?> directBufClass = Class.forName("sun.nio.ch.DirectBuffer");
MethodHandles.Lookup lookup = MethodHandles.lookup();
// Call clean() on the cleaner
MethodHandle clean = lookup.findVirtual(
cleanerClass, "clean", methodType(void.class));
// But only if the cleaner is non-null
MethodHandle nullTest = lookup.findStatic(
Objects.class, "nonNull", methodType(boolean.class, Object.class));
clean = MethodHandles.guardWithTest(
nullTest.asType(methodType(boolean.class, cleanerClass)),
clean,
nullTest.asType(methodType(void.class, cleanerClass)));
// Change receiver to DirectBuffer, convert DirectBuffer to Cleaner by calling cleaner()
clean = MethodHandles.filterArguments(clean, 0, lookup.findVirtual(
directBufClass,
"cleaner",
methodType(cleanerClass)));
// Change receiver to ByteBuffer, convert using explicit cast to DirectBuffer
clean = MethodHandles.explicitCastArguments(clean,
methodType(void.class, ByteBuffer.class));
return clean;
} catch (Throwable cause) {
return cause;
}
}
});
if (mayBeCleanerField instanceof Throwable) {
throw (Throwable) mayBeCleanerField;
}
clean = (MethodHandle) mayBeCleanerField;
clean.invokeExact(direct);
} catch (Throwable t) {
// We don't have ByteBuffer.cleaner().
clean = null;
error = t;
}
if (error == null) {
logger.debug("java.nio.ByteBuffer.cleaner(): available");
} else {
logger.debug("java.nio.ByteBuffer.cleaner(): unavailable", error);
}
CLEAN_METHOD = clean;
}
static boolean isSupported() {
return CLEAN_METHOD != null;
}
@Override
public CleanableDirectBuffer allocate(int capacity) {
return new CleanableDirectBufferImpl(ByteBuffer.allocateDirect(capacity));
}
@Deprecated
@Override
public void freeDirectBuffer(ByteBuffer buffer) {
freeDirectBufferStatic(buffer);
}
private static void freeDirectBufferStatic(ByteBuffer buffer) {
if (!buffer.isDirect()) {
return;
}
Source
Frequently Asked Questions
What is the CleanerJava6 class?
CleanerJava6 is a class in the netty codebase, defined in common/src/main/java/io/netty/util/internal/CleanerJava6.java.
Where is CleanerJava6 defined?
CleanerJava6 is defined in common/src/main/java/io/netty/util/internal/CleanerJava6.java at line 36.
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free