小编Kin*_*yan的帖子

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

在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在运行应用程序时使用,否则不可用.

有没有"正确"的方法来做到这一点?

我已经尝试使用它ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage().getMax()作为替代,maxDirectMemory但它总是返回-1 - 意味着该值不可用.也可以java.nio.Bits#MAX_MEMORY通过反思访问,但它仍然是" hackish ".


请注意,一个可能非常非常脏,并执行以下操作 - 为OpenJDK,Zulu和Oracle 11.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 | …
Run Code Online (Sandbox Code Playgroud)

java java-11

8
推荐指数
1
解决办法
621
查看次数

标签 统计

java ×1

java-11 ×1