OpenJDK在Linux中怎么确认CPU和内存配额

云萱小哥_7257

云萱小哥_7257

2026-10-20

305人浏览

原创

openjdk进程实际可用cpu核数需查cgroup限制:v1看cpu.cfs_quota_us/cpu.cfs_period_us,v2看cpu.max;jvm 10+默认通过usecontainersupport感知配额,但显式设置-xx:activeprocessorcount会覆盖该行为。

openjdk在linux中怎么确认cpu和内存配额

确认 OpenJDK 进程实际可见的 CPU 核数

容器或 cgroup 限制下,lscpu 或 nproc 返回的是宿主机总核数,不是 Java 进程能用的配额。必须看进程视角的可用 CPU —— 即 /sys/fs/cgroup 下的限制值。

  • 先查 Java 进程 PID:ps -eo pid,comm,args | grep java | grep -v grep
  • 再定位其 cgroup 路径:cat /proc/<pid>/cgroup | grep -E 'cpu|cpuset'</pid>(注意 v1 和 v2 路径不同)
  • 若为 cgroup v1(常见于 CentOS 7/RHEL 7):
    • CPU 配额:读 /sys/fs/cgroup/cpu,cpuacct/<path>/cpu.cfs_quota_us</path> 和 cpu.cfs_period_us,配额 = cpu.cfs_quota_us / cpu.cfs_period_us(如 200000/100000 = 2 核)
    • 若 cpu.cfs_quota_us = -1,表示无限制
  • 若为 cgroup v2(Ubuntu 22.04+/RHEL 8+ 默认):
    • 查 /sys/fs/cgroup/<path>/cpu.max</path>,格式为 "max 100000" 或 "200000 100000",后者即 quota/period
  • Runtime.getRuntime().availableProcessors() 在 JDK 10+ 会自动读取 cgroup 限制,但前提是 JVM 启动时未显式设置 -XX:ActiveProcessorCount —— 设了就绕过 cgroup,返回错误值

确认 OpenJDK 进程实际可用的内存上限

Java 进程看到的堆内存(-Xmx)和它被允许使用的物理内存(cgroup memory limit)是两回事。OOM Killer 杀进程前看的是后者,不是前者。

Obsidian (Linux)
Obsidian (Linux)

操作 Obsidian 库(纯 Markdown 笔记),并通过 notesmd-cli 实现自动化。

下载
  • 同样从 /proc/<pid>/cgroup</pid> 找 memory controller 路径
  • cgroup v1:读 /sys/fs/cgroup/memory/<path>/memory.limit_in_bytes</path>(-1 表示无限制)
  • cgroup v2:读 /sys/fs/cgroup/<path>/memory.max</path>(max 表示无限制)
  • JDK 自身行为:
    • JDK 8u191+ / JDK 10+ 默认启用 +UseContainerSupport,会自动按 cgroup limit 设置 MaxRAMPercentage(默认 25%),除非你手动指定 -Xmx
    • 若设了 -Xmx,JVM 就无视 cgroup limit —— 但宿主机仍会按 limit 杀你,导致“明明 -Xmx 没超,却被 OOM Kill”
  • 验证是否生效:启动 Java 时加 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps,看 GC 日志里 InitialHeapSize / MaxHeapSize 是否接近 cgroup limit × 0.25

为什么 free -h 和 jstat -gc 看到的内存对不上

这是最常踩的坑:系统级内存、JVM 堆内存、JVM 直接内存(Direct Buffer)、JIT 编译代码、线程栈等加起来才等于进程 RSS。只盯 jstat 会漏掉大头。

  • free -h 的 available 是系统空闲内存,跟 Java 进程无关;Mem: total 是宿主机总内存,不是你的配额
  • jstat -gc <pid></pid> 只反映堆内各代使用量,不包括 Metaspace、Compressed Class Space、Direct Buffer、线程栈(每个线程默认 1MB)
  • 真正可比的是:ps -o pid,rss,comm -p <pid></pid> 的 RSS 值 vs cgroup memory limit
  • 若 RSS 接近 limit,但 jstat 显示堆只用了 30%,大概率是 Direct Buffer 泄漏(ByteBuffer.allocateDirect() 未 clean)或大量线程未回收

检查 OpenJDK 是否识别到容器配额的快捷方式

不用翻 cgroup 路径,直接看 JVM 启动日志或运行时输出:

  • 启动时加 -XX:+PrintFlagsFinal -version | grep -E "ActiveProcessor|MaxRAM|UseContainerSupport":
    • UseContainerSupport := true → 已启用容器感知
    • ActiveProcessorCount 应等于 cgroup CPU 配额(非宿主机核数)
    • MaxRAMPercentage 默认 25.0,若没设 -Xmx,则 MaxHeapSize ≈ limit × 0.25
  • 运行中调用:jinfo -flag ActiveProcessorCount <pid></pid>,返回值应与 cgroup 配额一致
  • 如果返回值仍是宿主机核数(比如 64),说明:
    • JDK 版本太老(
    • 显式设置了 -XX:ActiveProcessorCount
    • cgroup 路径没挂载(Docker 未加 --cgroup-parent 或 systemd 服务未配置 MemoryLimit/CPUQuota)
关键点在于:OpenJDK 不会主动“申请”配额,它只被动响应 cgroup 文件系统的信号。一旦路径不对、权限缺失、或启动参数覆盖,它就退回看宿主机硬件 —— 而这个退路,在容器环境里恰恰是最危险的。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

2026.10.16

60

10

OpenJDK怎么配置Java开发环境
OpenJDK怎么配置Java开发环境

怎样用OpenJDK搭建开发环境?本专题介绍版本选择、下载安装、环境变量配置和编译运行验证,帮助你理清JDK的作用及基本配置流程,并通过简单程序检查环境是否可用,为后续项目开发做好准备。

2026.10.16

40

10

OpenJDK怎么部署Java应用
OpenJDK怎么部署Java应用

Java项目开发完成后,怎样部署到目标环境并正常运行?本专题介绍OpenJDK应用部署流程,涵盖运行环境准备、版本兼容检查、应用打包、启动参数配置和日志查看,帮助你理清部署前后的操作顺序,减少环境差异造成的运行问题。

2026.10.16

40

10

Revel框架模板渲染与表单验证
Revel框架模板渲染与表单验证

本专题围绕Revel框架视图层开发,介绍模板语法、变量输出、布局复用、表单提交、参数绑定与验证规则,帮助开发者完成安全规范的页面交互。

2026.10.16

20

15

Revel框架MVC路由与控制器
Revel框架MVC路由与控制器

本专题聚焦Revel框架MVC核心机制,讲解路由定义、控制器Action、参数绑定、请求响应和反向路由,并结合常见场景梳理接口请求处理流程。

2026.10.16

20

15

Revel框架入门与安装配置
Revel框架入门与安装配置

本专题从Revel框架环境搭建讲起,系统介绍命令行工具安装、项目创建、目录结构、配置文件及热代码重载,帮助开发者快速完成首个Go Web应用。

2026.10.16

20

15

Linux 新手先学哪些命令
Linux 新手先学哪些命令

Linux新手命令专题汇集终端基础、文件目录操作、文本查看、软件安装和权限管理等入门文章,帮助按实际任务练习常用命令并建立命令行操作习惯。

2026.10.15

40

20

MySQL 忘记密码怎么办
MySQL 忘记密码怎么办

MySQL忘记密码专题汇集不同版本与系统下的root密码重置方法,覆盖MySQL 5.7、8.0、Mac、Linux及本地集成环境,并提示恢复权限与重新登录的检查步骤。

2026.10.15

40

18

Vue.js 中 ref 和 reactive 的区别
Vue.js 中 ref 和 reactive 的区别

Vue.js中ref和reactive的区别专题汇集两种响应式API的定义、访问方式、对象解构、侦听与性能取舍等文章,帮助结合实际状态类型选择合适写法。

2026.10.15

20

20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
OpenJDK项目Wiki
OpenJDK项目Wiki

共0课时 | 0人学习

OpenJDK构建指南
OpenJDK构建指南

共0课时 | 0人学习

OpenJDK官网文档
OpenJDK官网文档

共0课时 | 0人学习