如何确定正在运行的 JVM 上的 MaxDirectMemorySize?

Li *_* Pi 2 java garbage-collection jvm bytebuffer

我有一个使用 DirectByteBuffers 来存储数据的应用程序,但我想知道 MaxDirectMemorySize 是什么,这样我就不会意外超过它。

如果不手动配置,我如何从程序中找出 MaxDirectMemorySize 是什么?

Tre*_*son 5

仅当在命令行上明确指定该选项时,接受的答案才有效。从 Java 6 开始,您可以使用HotSpotDiagnosticMXBean. 下面的Java 7代码可以方便的阅读:

final HotSpotDiagnosticMXBean hsdiag = ManagementFactory
        .getPlatformMXBean(HotSpotDiagnosticMXBean.class);
if (hsdiag != null) {
    System.out.println(hsdiag.getVMOption("MaxDirectMemorySize"));
}
Run Code Online (Sandbox Code Playgroud)

请注意,这可能会返回零值,这意味着使用默认设置,等于Runtime.getRuntime().maxMemory()。例如,对于 Windows 7 上的 Oracle JDK 7u71 64 位,这将返回 3,690,987,520。

或者,如果您愿意访问该sun.misc包,可以直接通过调用 来获取它sun.misc.VM.maxDirectMemory()