在我以前的博客文章热点选项中的Java 8改进的文档 ,我写的误解围绕热点JVM非标准的默认设置选项 -XX:MaxDirectMemorySize
。 在本文中,我介绍了一种确定HotSpot JVM中“默认”最大直接内存大小的简单方法。
Java启动器的Java 8文档针对-XX:MaxDirectMemorySize
声明了以下内容(我强调了 ):
设置新I / O(
java.nio
程序包)直接缓冲区分配的最大总大小(以字节为单位)。 字母k
或K
表示千字节,m
或M
表示兆字节,g
或G
表示千兆字节。 默认情况下,大小设置为0,这意味着JVM自动为NIO直接缓冲区分配选择大小。
上面解释了,如果没有通过-XX:MaxDirectMemorySize
选项明确指定大小,则HotSpot中最大直接内存大小的默认值为0 。 在这种情况下,使用-XX:+ PrintFlagsInitial和-XX:+ PrintFlagsFinal之类的选项无济于事,因为当未明确指定时,这些值也将显示为零。 例如,运行java -XX:+PrintFlagsFinal -version
显示:
size_t MaxDirectMemorySize = 0
据我所知,没有“标准”方式来访问最大直接内存大小。 类java.lang.Runtime提供有关JVM中的近似可用内存,JVM中的总内存以及JVM将尝试使用的最大内存的信息 。 尽管java.lang.management.MemoryMXBean除了提供堆内存使用之外还提供了