我一直对 JVM 如何控制堆外大小感到困惑,所以我会问以下问题来更好地理解它。
当人们使用Java
Unsafe
API在Java应用程序中分配堆外内存时,可以使用什么jvm选项来控制Unsafe可以分配的内存大小?是-XX:MaxDirectMemorySize
吗?还有其他选项也可以用来控制大小吗?
从JVM内存布局来看,有一个区域叫做直接内存,那么
MaxDirectMemorySize
就是用来控制这个区域的大小的?并且 Unsafe
正在从该区域分配内存?
如果未设置
-XX:MaxDirectMemorySize
,默认的堆外大小是多少。
如果
Unsafe
尝试分配超过JVM允许的内存(例如大于MaxDirectMemorySize),OOM还会发生吗?
是的 -XX:MaxDirectMemorySize 是控制可以分配的最大不安全内存的选项。
从 -XX:MaxDirectMemorySize 指定的区域创建不安全内存。这就是所谓的直接内存区域
-XX:MaxDirectMemorySize的默认值为0。
如果 Unsafe 尝试分配超过 JVM 允许的内存,就会发生 OOM