首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >替换JDK 11对sun.misc.VM的访问

替换JDK 11对sun.misc.VM的访问
EN

Stack Overflow用户
提问于 2018-11-29 16:03:42
回答 1查看 2.3K关注 0票数 12

在OpenJDK 8中,可以访问sun.misc.VM并调用isDirectMemoryPageAlignedmaxDirectMemory

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工作--但这不是这个问题的目标。

代码语言:javascript
复制
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__。:(

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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

评论参考:1 2 3.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53543062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档