runtime类无法直接获取cpu核心数,仅提供jvm堆内存管理能力;availableprocessors()返回操作系统可用逻辑核心数(受容器限制),freememory()等方法仅反映堆内存状态,非系统级资源;需用oshi或/proc接口获取真实服务器cpu和内存信息。

Java 中的 Runtime 类**无法直接获取 CPU 核心数**,它只提供与 JVM 运行时环境相关的内存管理能力(如总内存、空闲内存、最大内存)。CPU 信息需借助其他机制。
CPU 核心数:用 Runtime.availableProcessors()
虽然名字叫 availableProcessors(),但它返回的是操作系统**可用的处理器逻辑核心数**(含超线程),不是物理核心数,也不是服务器总核心数(而是当前 JVM 进程可使用的逻辑核心数):
- 在大多数现代服务器和容器环境中,它返回的是操作系统报告的可用逻辑 CPU 数
- 该值受容器限制(如 Docker 的
--cpus或 Kubernetes 的limits.cpu)影响,JVM 会感知并返回受限后的值 - 示例代码:
剩余内存:用 Runtime 获取 JVM 堆内存状态
Runtime 提供的是 JVM 堆内存(Heap)的使用情况,不是整个服务器的物理内存:
-
freeMemory():当前堆中未被使用的字节数(即“空闲堆内存”) -
totalMemory():当前 JVM 已向操作系统申请并分配的堆内存总量(可能未全部使用) -
maxMemory():JVM 堆内存的最大允许字节数(由-Xmx决定) - 注意:这不是服务器剩余物理内存,无法反映系统级内存压力
long freeHeap = rt.freeMemory();
long totalHeap = rt.totalMemory();
long maxHeap = rt.maxMemory();
long usedHeap = totalHeap - freeHeap;
获取真实服务器级 CPU 和内存(需绕过 Runtime)
若需获取宿主机(非 JVM)的 CPU 核心总数或系统剩余物理内存,需借助外部机制:
-
CPU 总逻辑核心数:读取
/proc/cpuinfo(Linux)或调用System.getenv("NUMBER_OF_PROCESSORS")(Windows) -
系统剩余内存:解析
/proc/meminfo(Linux)中的MemAvailable:字段;或使用第三方库如oshi-core - 推荐方式:引入 OSHI 库,一行代码即可获取准确系统信息:
CentralProcessor processor = si.getHardware().getProcessor();
long availableMemory = si.getOperatingSystem().getMemory().getAvailable();
小结:Runtime 的定位要清晰
Runtime 是为 JVM 自身服务的工具类,适合监控本进程的堆内存水位和调度资源上限。它不暴露操作系统底层硬件指标。真正做服务器资源监控时,应结合 OSHI、JMX、/proc 文件系统或运维侧指标采集工具(如 Prometheus + Node Exporter)。











