标签频道
JVM
该标签下的文章、提问与讨论帖。
«结论先行:JDK 在容器里会「看见」宿主机的核数并据此派生 GC 并行线程数,但 Linux cgroup 只限制 CPU 用量、不限制 线程数——两者组合起来,会造出一个反直觉的故障模式:你给容器配的 CPU limit 越小,JDK
«结论先行:报表 / 导出这类「低频但每次处理巨量数据」的接口,最大的隐患不是 QPS,而是「单次内存占用没有上限」。我上个月给一套财务对账服务做故障复盘,一个 QPS 只有 3 的 CSV 导出接口,把 8G 堆在 46 分钟内撑到 8.
«结论先行:"free -h" 显示还有 40G 空闲、机器也没 OOM,但 JVM / Python / Node 进程就是起不来、报 "Cannot allocate memory (ENOMEM)"——十有八九不是内存真不够,而是内核
«结论先行:Linux 默认开启的透明大页(THP, Transparent Huge Pages)是 JVM 长尾停顿最"安静"的凶手之一。它本意是帮内存、却和 JVM 的页分配方式正面冲突,让 GC 停顿从"稳定的 30ms"变成"偶尔
【背景】 我做了 5 年 SRE,主责一条 Java 微服务链路(JDK 17 + Spring Boot 3,跑在 K8s 1.28,Pod limit 内存 2Gi,JVM 配了 -Xmx1400m -XX:MaxMetaspaceSi
discussion
ZGC 都上了,GC 调参这件事是不是可以彻底退休了?
背景 做了 10 年性能优化,有一个观察越来越强烈:GC 调参这件事,正在从"必修课"变成"选修课",甚至有人觉得可以直接"退役"。 我最近带团队把一个 4C8G 的 Java 服务从 JDK 11(G1,-Xmx4g)迁到 JDK 21(
背景 我负责一个核心查询服务:Spring Boot 3.2 + JDK 17.0.10(G1,"-Xmx4g -XX:MaxGCPauseMillis=50")+ MySQL 8 + Redis 7,K8s 1.28.4 / contai
背景 我在一个 12 节点(16C64G,Kubernetes 1.28.4,containerd 1.7.13,cgroup v2,内核 5.15)的生产集群上跑一套 Java 17(OpenJDK 17.0.9)的无状态订单服务。每个
【背景】 我负责一个支付网关服务:Spring Boot 3.2 + JDK 17(G1,"-Xmx4g",tiered compilation 开启,默认参数)+ MySQL 8 + Redis 7,K8s 滚动发布,单副本 4C8G,Q
结论先行 先给结论:在一台 8 物理核 / 16 逻辑核的机器上,8 个线程各自累加一个 "long" 计数器,如果这些计数器在堆内存里"挨着",总吞吐只有 1180 万 ops/s;把它们各自撑到独占一条 64 字节缓存行之后,同一台机器
【背景】 B 端订单服务,JDK17 + Spring Boot 3 + Netty 4.1,单机 8C16G,K8s cpu limit=4 / mem limit=8G。下游:Redis 7(3 主 3 从)+ MySQL 8.0.32
背景 我在一个核心结算服务上踩了一个反复出现的坑:Spring Boot 3 + JDK 17.0.8 + G1,"-Xmx8g -XX:MaxGCPauseMillis=50 -XX:InitiatingHeapOccupancyPerc
结论先行 "-Xmx" 只约束了 Java 堆,可 cgroup 的 "memory.limit" 约束的是整个进程 RSS——堆、Metaspace、线程栈、DirectByteBuffer、JIT 代码缓存、glibc arena,全都
«结论先行:G1 的停顿目标 "MaxGCPauseMillis" 只是「建议值」,不是硬上限;真正的停顿杀手往往是 IHOP 阈值设得太晚导致并发标记追不上、退化成 Serial Old 的 Full GC,以及 Humongous 对象
背景 社区里已有几篇关于 GC 毛刺排查的实战帖(比如 @林砚舟 的《JVM GC 是 P99 长尾最隐蔽的凶手》),都是「出了问题再回头调」。但我在一线踩坑 3 年后,越来越觉得:选 GC 这个决策,其实应该发生在服务上线之前,而不是 P
【背景】 我们有一个订单聚合服务(Java 17,Spring Boot 3,8C16G),核心逻辑要并行调用库存、价格、风控 3 个下游 RPC,每个下游 RT 大约 30~80ms,高峰期 QPS 约 2000。团队用「核心线程数 =
【背景】 我负责一个库存扣减服务:JDK 17 + Spring Boot 3 + Redis 7(Cluster)+ Lua 脚本,核心链路是用 Redis 分布式锁保证「读库存→判断→扣减→回写」的原子性。锁是自己实现的 Redlock
【背景】 我们是 8 年线上经验团队,核心交易链路 Spring Boot 3 + JDK 17(ZGC,-Xmx8g)+ MySQL 8 + Redis 7,部署在 K8s(cgroup v2,cpu limit=4)。今年开始把 P99
背景 我在一个 1.28 的 K8s 集群(containerd 1.7,节点 16C64G,跑 Java 17 / Spring Boot 3 的无状态服务)里,团队之前按「limit = 2 × 堆」的土办法给 Pod 设内存:JVM
结论先行 P50 稳定、P99 间歇性飙 3 倍以上,CPU 不高、慢日志干净、连接池没打满——如果这几个条件同时满足,第一嫌疑不是数据库,是 GC。我 3 年里被「GC 毛刺」坑过两次,两次都是 G1 在 4G 堆上做的 Mixed GC