设置-XX:MaxDirectMemorySize后java.nio.BufferPool数值异常原因咨询
关于DirectMemory设置与MBeans显示不符的问题解答
-XX:MaxDirectMemorySize是上限而非初始分配值:你设置的3M是JVM允许使用的最大直接内存额度,而java.nio.BufferPool的TotalCapacity统计的是当前已分配使用的直接内存总量,并非上限值。你看到的5267是字节数(约5KB),远小于3MB的上限,属于正常情况。- DirectMemory按需分配:JVM不会在启动时就把
MaxDirectMemorySize设定的内存全部分配,而是随着应用对直接内存的需求逐步分配。Spring Cloud Gateway启动初期仅加载核心组件,直接内存使用量极低,所以TotalCapacity数值很小。 - 验证参数是否生效的方法:可以编写一段测试代码,循环申请直接内存直到超过3MB,此时JVM会抛出
OutOfMemoryError: Direct buffer memory异常,即可证明-XX:MaxDirectMemorySize=3M的设置已经生效。 - 注意单位换算:
BufferPool的TotalCapacity单位是字节,5267字节换算为MB仅约0.005MB,和你设置的3MB上限不存在冲突。
内容的提问来源于stack exchange,提问作者zjline
相关产品推荐
相关产品推荐

