<p>Runtime.getRuntime().availableProcessors() 返回 JVM 启动时确定的逻辑核心数,适用于线程池配置但不反映实时负载;内存方法仅监控堆内存,需用 totalMemory() - freeMemory() 估算已用堆内存,使用率≈(total-free)/maxMemory()。</p>

Java 中通过 Runtime 类可以快速获取 CPU 核心数和估算内存使用情况,但要注意它反映的是 JVM 视角的资源视图,不是操作系统级实时指标。
获取可用处理器核心数
Runtime.getRuntime().availableProcessors() 返回 JVM 可用的处理器逻辑核心数(含超线程),该值在 JVM 启动时确定,运行中不会动态变化。
- 适用于线程池大小设置、并行流分片等场景,例如:Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors())
- 注意:它不区分物理核与逻辑核,也不反映当前系统负载;容器环境下(如 Docker)若未配置 CPU 限制,可能返回宿主机总核数
- 若需更精确的 CPU 信息(如物理核数、频率、使用率),需借助 OperatingSystemMXBean 或第三方库(如 Oshi)
监控 JVM 内存占用(基于 Runtime)
Runtime 提供三个关键内存方法,组合使用可估算堆内存使用状态:
- totalMemory():JVM 当前已向操作系统申请的堆内存总量(字节)
- freeMemory():当前堆中未被使用的内存(即 total - used),GC 后会明显增大
- maxMemory():JVM 堆内存最大可扩展上限(-Xmx 设置值,未设则为平台默认)
由此可计算近似已用堆内存:used = totalMemory() - freeMemory();使用率 ≈ used / maxMemory()(注意 maxMemory() 可能为 Long.MAX_VALUE,表示无硬上限)。
注意事项与局限性
- Runtime 的内存方法仅覆盖堆内存,不包含元空间(Metaspace)、直接内存(Direct Buffer)、线程栈等非堆区域
- freeMemory() 并非“空闲可用”,而是“当前未分配对象的剩余空间”,受 GC 策略影响大,不适合做精确容量预警
- 高频调用这些方法几乎无开销,但不能替代专业监控(如 JMX、Prometheus + JMX Exporter)
- 生产环境建议结合 MemoryUsage(来自 ManagementFactory.getMemoryMXBean())获取更规范的内存分区数据















