上一题下一题

权限快照使用 CopyOnWriteArrayList,读请求每秒数十万但配置发布会批量写入,发布期间出现延迟尖峰和堆内存上涨,如何判断其适用性并设计替代方案?

进阶版
来源:baidu中级工程师高并发缓存方案设计业务指标关联分析写时复制适用性评估缓存一致性
草稿该题目为草稿状态,前台公开题库中不可见。
答案解析

我会先判断瓶颈是不是 CopyOnWriteArrayList 的写时复制成本,而不是直接因为读多就认定它适用。它的读取基本无锁,适合读远多于写、集合规模不大、且写入频率低的场景;但每次写入通常都要复制底层数组。批量发布时,如果逐条增删,会反复分配和复制数组,产生大量内存分配与 GC 压力。即使改成一次批量替换,复制本身也与快照大小成正比,发布瞬间仍可能出现延迟和堆占用尖峰。

我会结合发布耗时、写入次数、快照大小、分配速率、GC 暂停和请求延迟监控来验证:尤其看尖峰是否与配置发布时间重合,以及堆分配是否集中在 Object[] 等数组对象上。还要确认读请求是否真的只需要遍历快照,是否存在过大的快照、过于频繁的发布,或者发布期间有多次中间状态可见的问题。

如果读请求只需读取一份完整、一致的权限快照,我倾向于改成不可变快照加原子引用:发布线程在独立对象中构建并校验新快照,完成后通过 AtomicReference 或 volatile 一次性替换引用;读线程每次取得当前引用后直接查询或遍历,不加锁,也不会看到发布过程中的中间状态。旧快照由 GC 回收。对于按用户、角色或

登录后查看完整内容