28-CPU 100% 飙高:火焰图定位死循环与正则回溯
#CPU飙高 #火焰图 #性能调优 #Arthas #JDK8版本声明:本文基于 JDK 8(1.8.0_x) 与 Arthas 4.x(内置 async-profiler)编写。凡涉及 JDK 9+ 的差异,一律以「版本演进注记」单独标注。
Full GC 每 20 秒一次,重启十天又犯
每个 Java 后端都见过那个告警:Full GC frequency spike。多数人的动作是:重启 → 告警消失 → 结案。一个月后同一个告警再来。重启解决不了内存问题,只是把证据销毁了。
你的static final,正拖慢启动
上周给一个交易系统做启动优化,JDK 26 升上去之后,启动时间从 12 秒降到了 7 秒。排查下来,最大的贡献不是 JIT 预热,不是 G1 改进,而是一个不起眼的 JEP 526:懒加载常量(Lazy Constants)。
事务没生效,代码却能跑:AI 最容易写错的 4 处
用 AI 写 Spring Boot 业务代码,最容易出事的地方不是语法,也不是接口设计,而是事务。它给的代码通常长这样:一个 Service 方法,上面标着 @Transactional,里面几步数据库操作,看着一点问题都没有。跑自测也没问题。
Java对象明明不用了,为什么内存一直降不下来?
【01 问题现象:对象不用了,内存却没释放】一句话概括:Java有垃圾回收机制,但不代表不再使用的对象一定会被回收。
静态代码块和构造器的执行顺序,类初始化时机这题隐蔽得很
上周帮部门面一个五年经验的候选人,我在共享文档里贴了段代码,让他口述输出顺序。他答得很快,快到我知道他背过。然后我改了一行,把 new Child() 换成 Child.NAME,他就卡住了。这题的杀伤力从来不在执行顺序本身,而在类初始化的触发时机。
JVM-09: Java 堆:对象的生与死
上一篇收尾时说,下一篇回到线程共享的地盘。这篇就是:Java 堆,JVM 里最大的一块内存,你写下的每一个 new,最终都落在这里。这一篇围绕对象的一生展开:new 一行代码背后发生了什么,内存从哪里划出来,对象在内存里长什么样、有多重、怎么被访问、什么时候死。
10万QPS × 100万人 = 100亿次/秒,弹幕系统怎么不死?
主播一句「来波 666」,背后是 10 万 QPS 写入、一条弹幕送达百万人的广播流。逐条推送?10 万 × 100 万 = 100 亿次/秒,物理上不成立。弹幕系统的核心矛盾不是「写不写得进」,而是「扇出降不降得下来」。
线上频繁Full GC,到底是谁在搞事情?
【01 问题现象】一句话概括:偶尔一次Full GC不可怕,真正麻烦的是它开始频繁出现。线上Java服务运行一段时间后,有时会出现这种现象:接口突然变慢;RT周期性升高;CPU偶尔出现尖峰;GC日志里不断出现Full GC;Full GC之后内存降下去了,但很快又涨回来。