在OpenJDK 8中,可以访问sun.misc.VM并调用isDirectMemoryPageAligned和maxDirectMemory。
isDirectMemoryPageAligned用于正确地调整要分配的直接内存的大小,就像DirectByteBuffer所做的那样。
maxDirectMemory用于报告内存统计数据以及提供为-XX:MaxDirectMemorySize配置的值的访问。在内部,它将限制允许的直接内存消耗。
自OpenJDK 9以来,类VM已被移动到jdk.internal.misc中,除非在运行应用程序时使用--add-export java.base/jdk.internal.misc=xyz,否则类VM不可用。
有什么“正确”的方法吗?
我已经尝试使用ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage().getMax()作为maxDirectMemory的替代品,但它总是返回-1 -这意味着该值不可用。通过反射访问java.nio.Bits#MAX_MEMORY也是可能的,但它仍然是"hackish“。
请注意,您可能非常脏,并执行以下操作--为OpenJDK、Zulu和Oracle11.0.1工作--但这不是这个问题的目标。
public static void tryExportInternal() {
final String moduleName = "jdk.internal.misc";
final Module javaLang = Integer.class.getModule();
// Method used only for tests by the JDK...
final Method exporter;
try {
exporter = Module.class.getDeclaredMethod("implAddExports", String.class);
exporter.setAccessible(true);
exporter.invoke(javaLang, moduleName);
} catch (NoSuchMethodException | IllegalAccessException e) {
LOG.log(Level.INFO, "Cannot access internal Module method", e);
} catch (InvocationTargetException e) {
LOG.log(Level.INFO, "Cannot call internal Module method", e);
}
}在源代码中,implAddExports被标记为@apiNote This method is for JDK tests only__。:(
发布于 2018-12-10 09:16:14
这个答案来自https://stackoverflow.com/users/7463126/alan-bateman对这个问题的各种评论。
不,没有标准的API来访问这两个想要的方法。
从JDK 6开始,DirectxxxBuffers不再对齐分页。因此,不需要访问VM.isDirectMemoryPageAligned来再现DirectBuffers所做的事情。
关于手动内存分配,作为问题背后的用例,目前唯一进行直接内存分配的API是ByteBuffer.allocateDirect,或者它的JNI替代NewDirectByteBuffer。
https://stackoverflow.com/questions/53543062
复制相似问题