gpt4 book ai didi

java - 为 JDK 11 替换对 sun.misc.VM 的访问

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:56:26 24 4
gpt4 key购买 nike

在 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 | 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. :(

最佳答案

这个答案来自Alan Bateman的各种评论问题。

不,没有标准的 API 可以访问这两个想要的方法。

从 JDK 6 开始,DirectxxxBuffers 不再是分页对齐的。因此,无需访问 VM.isDirectMemoryPageAligned 即可重现 DirectBuffers 的功能。


关于手动内存分配,作为问题背后的用例,目前唯一进行直接内存分配的 API 是 ByteBuffer.allocateDirect,或其 JNI 替代方案 NewDirectByteBuffer .


评论引用:1 2 3

关于java - 为 JDK 11 替换对 sun.misc.VM 的访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53543062/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com