这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
《Java 高级编程》6.2 结构化并发:StructuredTaskScope 与作用域取消
三个查询扇出,一个 50ms 就失败,另一个却跑满 400ms——invokeAll 不会取消兄弟任务。本节用 JDK 25 预览版的 StructuredTaskScope 把 DashboardService 的三路聚合改成「全成功或全取消」,并实测失败 44ms 返回、超时 106ms 中止。
posts
这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
三个查询扇出,一个 50ms 就失败,另一个却跑满 400ms——invokeAll 不会取消兄弟任务。本节用 JDK 25 预览版的 StructuredTaskScope 把 DashboardService 的三路聚合改成「全成功或全取消」,并实测失败 44ms 返回、超时 106ms 中止。
80 万个 LoanEvent 在 1.03 秒内分配完,折合 2.5 GB/s。本节用 -Xlog:gc+tlab=debug 读 TLAB totals、用 gc+plab 看 PLAB、用 gc+region 定位 Humongous,再用 JFR 的 jdk.ObjectAllocationSample 找分配热点,最后讨论 libraryd 每请求创建 LoanEvent 的取舍。
2000 个虚拟线程只用了 10 个载体线程,同一个虚拟线程睡一觉就换了载体。本节用三个可复现实验拆开挂起、迁移与 pinning,验证 JDK 24 JEP 491 之后 synchronized 不再 pin,而本地调用仍然占住载体,并给出 Javalin 7 的落地配置。
一个 Loan 到底占多少内存?字段宽度相加是 36 字节,JOL 说是 48。本节用 JOL 0.17 打印 Book、Small、Padded、int[3]、Loan 与 FinePolicy 的对象布局,解释 mark word、压缩类指针、字段重排与 8 字节对齐,再用 -XX:-UseCompressedOops 对照,最后核算 100 万 Loan 的缓存预算。
收口不是把前十二章再讲一遍,而是把每条约束改写成可执行断言、证据要求与风险等级。本节给出 16 条覆盖第 1 到 12 章的质量场景,用台账函数检查断言、证据、章节覆盖与卷四移交项,并用发布门禁区分高风险阻断与中风险警告,最后说明多端、规模化与平台化为什么留给卷四。
「回声」商家版租户被自己的预留限流三天:拦截分支没有结算,也未释放额度,真实花费不到配额三分之一。本节用整数微元、租户/能力/模型三维计量、预留与结算、失败也记账和 TTL 回收,搭一个可测试的成本账本,并复盘这次泄漏从发生到被发现的每一步。
启动预热要等三件事都完成、数据库同时只能进十个任务、分批导出要四个线程每轮对齐。本节用三组真实运行对比 CountDownLatch、Semaphore 与 CyclicBarrier 的语义差异,给出 libraryd 的 StartupGate、DbConcurrencyGate 与 ExportBarrier 实现,以及各自的失效边界。
线上 RSS 比 -Xmx 多出 1 GB,钱花在哪?本节用 MemoryShape 复现 libraryd 的线程与内存形状,跑 -XX:NativeMemoryTracking=summary 与 jcmd VM.native_memory、VM.metaspace、GC.heap_info,逐项解释 reserved/committed/used,并给出堆、元空间、直接内存与线程栈的预算表。
从《裂隙战场》节点“还有空闲内存却开不出房”的现象出发,说明实例分配器的赛区、版本、资源规格硬约束,比较冷启动、固定暖池与弹性暖池的成本,拆解正常结束、异常退出、节点故障三条回收路径与装箱碎片的具体成因和应对办法,并给出可运行 Go 实现。
借阅事件的审计写库不该拖慢请求线程。本节用 ArrayBlockingQueue 搭一条有界流水线,用 300 个事件、32 个槽位、2 个消费者的饱和实验展示背压与拒绝,再把优雅停止做成可观测的 pending、drained、abandoned 三个数。
方法调用在 JVM 里就是一个栈帧。本节用 javap -c 的真实输出拆开局部变量表、操作数栈、动态链接与异常表,让五种调用指令各出现一次,并逐指令走完 FinePolicy.DEFAULT.fineCents(20) 的 1000 分计算过程。
从 order.created 事件把金额从整数分改成字符串小数的一次发布事故切入,区分 backward、forward 与 full 三种兼容方向,给出七类字段变更的判定表和单文件 Go 检查器,并用真实测试输出说明新增、删除、改类型与改可选性各自会让哪个方向断裂。
class 文件变成可用的类要经过加载、链接、初始化。本节用 -Xlog:class+load 与 jcmd VM.classloaders 的输出拆开这三步,实测 Class.forName 与 loadClass 的初始化差异、两个 URLClassLoader 加载同一 jar 的类身份冲突,并落到 libraryd 的 PluginClassLoader 与 ServiceLoader。
依赖规则如果只写在评审清单里,就会在下一个紧急需求里被绕开。本节把向上依赖、跨层导入、未知模块与重复模块写成可执行断言,并用消消与方舟两张模块图报告验证:每条跨层边都必须向下,同层边单独计数,向上边直接阻断合并,报告可归档,也可作为发布前门禁。
用 synchronized 包一个 HashMap 也能线程安全,为什么 libraryd 还要换 ConcurrentHashMap?本节用 800 万次原子与非原子写入、三组键规模的对比实验,说明争用点在哪里,再用 CopyOnWriteArrayList 实现借阅监听器,给出两者的适用边界。
用 javap -v -p 和 xxd 拆开 Book 与 FinePolicy 的 class 文件:magic 与 major 69、常量池的描述符与两槽常量、字段与方法表、Code/LineNumberTable/BootstrapMethods/Record 属性,并解释 record 的 toString/equals/hashCode 为何是 invokedynamic。
销售做得好不好,不能靠感觉。本文把前面九篇收成九项检查与四维评分,用一次季度复盘找出答不上来的四项,算出 3.23 分与补线索后的 3.41 分,并把八十二小时、一千三百一十四美元与六点零个月放在一张表里,给出下一季只补一项的顺序。
内容做了一年,到底该继续、该修还是该停?本文用九项检查、生产与分发与转化与归因四维评分,给出三点一五分的现状与三点三零分的改进路径,拆开一个季度四十五小时的分配,说明三档结论对应什么动作,以及为什么验收要放在季度最后一周。
签约不是终点,是客户第一次真正用你的产品。本文用一页合同、九十分钟开通与三十天两次检查,说明四个必写字段、开通的三个阶段、两个成功指标怎么定,以及交接失败时怎么在当天补救、怎么把口头承诺写进一页纸,最后给出可以照着走的四行交接清单。
同样二十四单,首次接触、末次接触与线性归因会给出三个不同的内容 CAC。本文用一万一千一百四十八美元成本,拆开三种口径下的十七单,说明直接访问该怎么处理,算清四百六十五美元与六百五十六美元的差距,以及第二年边际成本为何只剩一千八百美元。