bigywater.tech
Java · 312

NUMA 与 Java 进程

NUMA 机器上 JVM 怎么分配内存、-XX:+UseNUMA 起什么作用?这篇说清楚一件事:在没有 NUMA 的机器上能验证什么,不能验证什么。能验证的部分(参数被接受、日志、默认值、ActiveProcessorCount)逐项给出。

Disabled
所有收集器、两个 JDK 版本里 -XX:+UseNUMA 在本机的日志结果
0
本机 sysctl 里名字含 numa 的项数
N=16 → 13
-XX:ActiveProcessorCount=16 时 G1 的 GC 线程数

本机拓扑

实测 · 本机执行输出
  hw.packages = 1
  hw.physicalcpu = 10
  hw.logicalcpu = 10
  hw.memsize = 17179869184
  hw.nperflevels = 2
  sysctl 里名字含 numa 的项: 没有
  命令是否存在: {'numactl': False, 'lscpu': False, 'numastat': False, 'taskset': False}

UseNUMA 的反应

实测 · 本机执行输出
  JDK 21 UseSerialGC      rc=0 NUMA 相关日志:['NUMA Support: Disabled']
  JDK 21 UseParallelGC    rc=0 NUMA 相关日志:['NUMA Support: Disabled']
  JDK 21 UseG1GC          rc=0 NUMA 相关日志:['NUMA Support: Disabled']
  JDK 21 UseZGC           rc=0 NUMA 相关日志:['NUMA Support: Disabled']
  JDK 21 UseShenandoahGC  rc=0 NUMA 相关日志:['NUMA Support: Disabled']
  JDK 27 UseSerialGC      rc=0 NUMA 相关日志:['NUMA Support: Disabled']
  JDK 27 UseParallelGC    rc=0 NUMA 相关日志:['NUMA Support: Disabled']
  JDK 27 UseG1GC          rc=0 NUMA 相关日志:['NUMA Support: Disabled']
  JDK 27 UseZGC           rc=0 NUMA 相关日志:['NUMA Support: Disabled']
  JDK 27 UseShenandoahGC  rc=0 NUMA 相关日志:['NUMA Support: Disabled']

参数默认值

实测 · 本机执行输出
  JDK 21: {'NUMAChunkResizeWeight': '20', 'NUMAInterleaveGranularity': '2097152', 'NUMAPageScanRate': '256', 'NUMASpaceResizeRate': '1073741824', 'UseNUMA': 'false', 'UseNUMAInterleaving': 'false'}
  JDK 27: {'NUMAChunkResizeWeight': '20', 'NUMAInterleaveGranularity': '2097152', 'NUMASpaceResizeRate': '1073741824', 'UseNUMA': 'false', 'UseNUMAInterleaving': 'false'}

ActiveProcessorCount

实测 · 本机执行输出
  默认: availableProcessors=10,commonPool 并行度=9
  -XX:ActiveProcessorCount=1 : availableProcessors=1,commonPool 并行度=1 ; G1 GC 线程数:1
  -XX:ActiveProcessorCount=2 : availableProcessors=2,commonPool 并行度=1 ; G1 GC 线程数:2
  -XX:ActiveProcessorCount=4 : availableProcessors=4,commonPool 并行度=3 ; G1 GC 线程数:4
  -XX:ActiveProcessorCount=16: availableProcessors=16,commonPool 并行度=15 ; G1 GC 线程数:13

分步演示

NUMA 与 Java 进程
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / OpenJDK(Temurin 17.0.20、Homebrew 21.0.12 与 27,每篇注明实际用的版本);用 javac 编译、java 直接运行,需要第三方库时用 Maven 解析依赖;计时用 System.nanoTime,数字每次运行会有小幅抖动。JDK 21.0.12 与 27;macOS arm64(无 NUMA)
    • 没有验证(本机没有 NUMA 硬件,也没有 Linux):-XX:+UseNUMA 在真实多节点机器上的分配与线程亲和效果、numactl --interleave / --cpunodebind 对 JVM 的影响、跨节点访问的延迟、-XX:+UseNUMAInterleaving 的收益、Docker / cgroup 下 CPU 个数的探测——这些都是文章标题要说的主题,但此处只能如实说明没有测
    京ICP备2026067502号-1京公网安备11010502063487号