Skip to content

Java9 Support, remove use of internal api:s #3

@pethers

Description

@pethers

jdeps result

org.jrobin.core.RrdNioBackend -> sun.misc.Cleaner JDK internal API (JDK removed internal API)
org.jrobin.core.RrdNioBackend -> sun.nio.ch.DirectBuffer JDK internal API (java.base)

Support Oracle JDK6-9

fix from
http://stackoverflow.com/questions/1854398/how-to-garbage-collect-a-direct-buffer-java


private void unmapFile() {
destroyBuffer(byteBuffer);
}

private static void destroyBuffer(Buffer buffer) {
    if (buffer != null && buffer.isDirect()) {
        try {
            if (!buffer.getClass().getName().equals("java.nio.DirectByteBuffer")) {
                Field attField = buffer.getClass().getDeclaredField("att");
                attField.setAccessible(true);
                buffer = (Buffer) attField.get(buffer);
            }

            Method cleanerMethod = buffer.getClass().getMethod("cleaner");
            cleanerMethod.setAccessible(true);
            Object cleaner = cleanerMethod.invoke(buffer);
            Method cleanMethod = cleaner.getClass().getMethod("clean");
            cleanMethod.setAccessible(true);
            cleanMethod.invoke(cleaner);
        } catch (Exception e) {
            throw new RuntimeException("Could not destroy direct buffer " + buffer, e);
        }
    }

}

Tested with JDK8, JDK9_b121 require jvm option for JDK9
"-XaddExports:java.base/jdk.internal.ref=ALL-UNNAMED"

Possible solution to support other JDK providers at
https://sourceforge.net/p/tuer/code/HEAD/tree/pre_beta/src/main/java/engine/misc/DeallocationHelper.java

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions