Runtime类可获取JVM可用处理器数和堆内存信息:availableProcessors()返回逻辑核心数(容器中JDK10+尊重cgroups),freeMemory()仅反映堆内未用空间,非系统剩余内存;需用OperatingSystemMXBean获取系统级资源。

Java 中的 Runtime 类可以方便地获取 JVM 运行时环境的基本信息,包括可用处理器数(即 CPU 核心数)和内存使用情况。但要注意:它返回的是 JVM 可用 的资源,不等于物理服务器的全部资源(尤其在容器或虚拟化环境中)。
CPU 核心数:getAvailableProcessors()
这个方法返回 JVM 启动时检测到的可用处理器数量,通常是操作系统报告的逻辑核心数(含超线程)。
- 调用方式简单直接:Runtime.getRuntime().availableProcessors()
- 结果是 int 类型,无需额外计算,也不受当前负载影响
- 在 Docker 容器中若设置了
--cpus=2或cpu-quota,JDK 10+ 默认会尊重 cgroups 限制(旧版本可能仍返回宿主机总核数)
剩余内存:freeMemory() 与实际“空闲内存”的区别
Runtime.freeMemory() 返回的是 JVM 堆内存中目前未被使用的字节数,不是系统剩余内存。它只反映堆内碎片和已分配但未使用的空间,且受 GC 状态影响极大。
- 刚启动时 freeMemory() 可能很大,但不代表可用;一次 Full GC 后可能骤降
- 真正想看 JVM 堆“还能分配多少”,应结合 maxMemory() - totalMemory() + freeMemory()(即最大堆减去已提交堆中未用部分)
- 若目标是查操作系统级剩余内存,Runtime 类做不到——需借助 OperatingSystemMXBean 或 JNA/Shell 调用
实用示例代码
下面是一段安全获取并打印关键运行时信息的代码:
Runtime rt = Runtime.getRuntime();
int cores = rt.availableProcessors();
long maxHeap = rt.maxMemory(); // JVM 最大堆大小(字节)
long totalHeap = rt.totalMemory(); // 当前已向 OS 申请的堆内存
long freeHeap = rt.freeMemory(); // 当前堆中未用字节
<p>System.out.println("CPU 核心数: " + cores);
System.out.println("最大堆内存: " + maxHeap / 1024 / 1024 + " MB");
System.out.println("已分配堆内存: " + totalHeap / 1024 / 1024 + " MB");
System.out.println("堆中空闲内存: " + freeHeap / 1024 / 1024 + " MB");
System.out.println("估算可用堆: " + (maxHeap - totalHeap + freeHeap) / 1024 / 1024 + " MB");
注意事项
- Runtime 是单例,getRuntime() 每次都返回同一实例,无需缓存
- 避免频繁调用 freeMemory() 做监控——它本身开销小,但数值波动大,易误导
- 如需系统级 CPU 或内存数据(例如容器外真实剩余内存),请改用 java.lang.management.OperatingSystemMXBean 的
getAvailableProcessors()和getFreePhysicalMemorySize()(JDK 7+)

















