一个 4 核 8GB 的容器部署 Java 服务,你会怎么分配堆、元空间、直接内存和线程栈?
我的判断
8GB 容器不会把 8GB 都给堆;我会从线程、直接内存和安全余量倒推,初始通常把 Xmx 放在 3.5~4.5GB 再压测校正。
一个常规 Web 服务可以先按这份预算起步:堆 4GB,元空间上限 512MB 左右,直接内存按网络框架和缓冲需求设 512MB~1GB,code cache 与 JVM 本地结构预留几百 MB,再给线程栈和 native 分配留下至少 20% 容器余量。
线程栈不是越大越安全。假设 500 个平台线程、-Xss1m,理论保留空间就可到 500MB;调用栈不深时会评估 512KB,但必须跑递归和框架最深链路测试。Netty 服务会显式监控 direct memory,不能只设置 Xmx。
我会让 Xms 与 Xmx 是否相等取决于部署方式:延迟敏感、资源独占时可以相等;弹性容器则看启动和内存承诺策略。最终用峰值流量观察堆稳定占用、GC 后余量、RSS、线程数和 OOMKill 风险。
这不是固定公式。同样 4 核 8GB,网关、Netty 服务和批处理任务的堆外与线程模型完全不同。