这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
《Java 虚拟机原理与性能调优》7.3 元空间与直接内存:类生成与堆外泄漏
堆没满、进程却一直涨,问题常在 -Xmx 之外。本节用 Byte Buddy 1.18.16 生成类,在 64 MB 元空间上限下复现真实 Metaspace OOM;再用 32 MB 直接内存上限复现 Cannot reserve 报错,并给出 VM.metaspace、NMT 与插件热重载的排查路径。
posts
这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
堆没满、进程却一直涨,问题常在 -Xmx 之外。本节用 Byte Buddy 1.18.16 生成类,在 64 MB 元空间上限下复现真实 Metaspace OOM;再用 32 MB 直接内存上限复现 Cannot reserve 报错,并给出 VM.metaspace、NMT 与插件热重载的排查路径。
卷四前言:说明四卷分工与本卷的位置,交代每章「现场—模型—代码—判据」的四段写法、evolve-lab 的模块地图与三级验证命令、代码与命名约定、章与章之间的依赖、每章应留下的产出物清单,以及如何在团队中把书里的判断落地;并附三个动手练习、自检清单与勘误渠道。
FFM 能调用 C,但 native 代码里的空指针会直接带走整个 JVM,try/catch 接不住。本节用真实的 SIGSEGV 崩溃输出说明隔离边界,讨论 Arena 清理、库卸载、跨平台分发与 JNI 迁移成本,并给出 libraryd 在 native 与纯 Java 校验器之间的选择与回退代码。
内存一直涨不等于泄漏。本节用 -Xmx64m 把一个 static Map 逼到真实 OutOfMemoryError,采样出 13 MB 到 67 MB 的线性增长曲线,用直方图盯住 [B 的实例与字节,并用 WeakHashMap 实验说明弱引用为什么救不了值反向持有键的缓存。
战斗结束后的奖励发放,最容易出的问题不是算错,而是发两次。本节从 battle_id、参战者、结果和奖励表版本四类输入出发,对比先落结算单与先发奖两种顺序,给出幂等键、唯一约束、状态机、改判权限和冲正流程,并用可运行代码演示重复请求、部分失败与二次冲正的处理。
JNI 需要写头文件、编译胶水代码、处理引用计数。本节用 JDK 25 正式的外函数与内存 API 编译 libisbn,通过 Linker、SymbolLookup 和 MemorySegment 真实调用 isbn13_check_digit,演示 Arena 生命周期与结构体布局,并记录不加 --enable-native-access 时的告警原文。
堆转储不是截一张内存快照就完事。本节用 500 个 64 KB 数组实测 jcmd GC.heap_dump 生成 37 MB hprof,讲清 shallow size、retained size 与支配树,给出 GC Root 路径的读法、MAT 操作步骤和 libraryd 的 dump 落盘策略。
卷四序:从一次「五端各自发布」的失控写起,说明规模化的真正难点不是代码量,而是承诺、边界与治理;交代前三卷留下的三笔债、本卷的四条判断、十三章的收束方式,以及为什么把无障碍与国际化放进架构书;并给出三条阅读路径、与书架其他书稿的分工,以及三级可运行验证的口径。
classpath 上的 libraryd 能编译、能启动,却可能在运行时才暴露缺包和 split package。本节真写 module-info.java,用 jdeps 分析依赖、打成 modular jar,再用 jlink 裁出 32 MB、3 个模块的运行时,并记录缺模块、自动模块名和 classpath 绕过模块描述符的真实输出。
ZGC 的停顿为什么和堆大小基本无关?染色指针与读屏障到底做了什么?本节用本机 10 秒 G1 与 ZGC 对照实验拆开停顿、MMU、Allocation Stall 与 RSS,并说明换收集器前要算清的三笔账,读完能判断什么时候该换、换了要付什么代价。
从一次 xDS 路由顺序错误导致金丝雀集群收不到流量的事故出发,说明 Sidecar 能买到什么、买不到什么,给出首匹配路由的重复、遮蔽与悬空引用检查器,以及 sidecar 资源与配置评审的月度成本模型,并附标准库 Go 实现与真实测试输出。
壳的厚薄不取决于代码量,而取决于启动链路上有多少能力必须阻塞等待。消消的轻壳把账号、支付、广告降级为可延迟能力;方舟的重壳把账号、防沉迷与渠道 SDK 放上关键路径。同一份 Host 契约用能力、阻塞与回退三列容纳两者,桥接层不需要按产品写分支。
《裂隙战场》的 30 Hz 对抗、《群岛纪元》的异步战报和《泡泡工坊》的轻量对局,对战斗进程的要求完全不同。本节用 tick 预算、战斗时长、回放要求和团队运维能力四组约束,对比房间内计算、独立战斗服与托管算力三种模型的延迟、成本与故障域,并给出崩溃恢复语义和可运行的选型函数。
从订单服务调用库存时一次慢节点触发客户端重试、把流量放大数倍的事故出发,对比轮询、随机、P2C 与最小连接数的取舍,说明同可用区优先的局部性与溢出条件,给出带重试预算的 Go 负载均衡实现与真实测试输出,并拆解多层重试在调用链上的完整放大算式。
世界 Boss 刷新、赛季结束、全服公告看起来都是一条消息,扇出代价却相差几个数量级。本节先算连接数、消息大小与频率的乘积,再按全服、战区、地图、房间四级拆通道,讨论分区订阅如何隔离热点、有界日志如何支撑补发,以及去重、乱序和断线补发分别该怎么处理。
G1 的 region 到底多大?多大的对象算 Humongous?IHOP 和 MaxGCPauseMillis 改了为什么没效果?本节用本机实测拆开 Region、Humongous、Mixed GC 与停顿目标,并给出 libraryd 导出任务避开大对象的写法。
可以带进评审会的交易端清单:按所有权、状态机、金额、幂等与重复、失败路径、优惠与会员、增长与实验、埋点与观测、安全与隐私、发布与回滚十组问题逐项提问,每组给出通过标准与常见缺陷,另附「未验证」栏、评审记录模板、快速版十问与不通过判据,供方案评审与上线前评审直接使用。
一行 GC(9) Pause Young (Mixed) 431M->313M(512M) 0.964ms 里每个字段是什么意思?本节用本机 12 秒真实日志拆字段、讲标签、复现 Evacuation Failure,并给出解析停顿的 gc-summary.py。
桥接层不是一组回调,而是一套有版本、有错误码、有线程归属的消息协议。本节用三条队列表达主线程、渲染线程与后台线程的边界,让每次调用都可超时、可取消、可测试,并给出 mock Host 的最小实现与五类错误语义;队列过滤与迟到响应处理是两处最容易被忽略的细节。
按症状组织的交易端排查手册:支付成功但订单未变、重复扣款、金额不一致、券不可用、库存显示有货却下单失败、退款不到账、会员权益不生效、漏斗数据对不上,每一类给出定性顺序、必查字段、常见原因排序、证据留存方法与升级人工的判据,并附最小信息集与时间线还原方法。