Claude Code源代码

Claude Code源代码 参考URL: 如何评价Claude Code源代码泄漏? - 卜寒兮的回答 - 知乎 https://www.zhihu.com/question/2022392127145911515/answer/2022520709964931142 总结:值得借鉴的设计模式 模式 在 Claude Code 里的体现 可借鉴的场景 AsyncGenerator 作为流式原语 query() 的整体结构 任何需要流式输出 + 可中断的 agent 分层错误恢复 五层上下文压缩策略 资源受限下的 long-running task 流式并发工具执行 StreamingToolExecutor 多工具并行调用的 agent 投机性预计算 startSpeculativeClassifierCheck 任何有必然后续操作的流程 工具自声明并发安全性 isConcurrencySafe() 接口 混合读写操作的任务编排 Forked Agent 共享缓存 CacheSafeParams + compact agent 需要 fork 子任务但不想丢失 prompt cache Hook 与主循环解耦 Post-sampling / stop hooks 任何需要插入评估逻辑的 agent 系统 回到上面那句话:harness 编码了对”模型不能独立完成什么”的假设(“the harness itself encodes assumptions about what models cannot do independently”。) ...

April 15, 2026 · 1 min · 76 words · WY

Java引用类型详解:从源码到实战

目录 目录 引言 先搞清楚一个前提:可达性分析 强引用(Strong Reference) 软引用(Soft Reference) 基本用法 源码级分析:MyBatis的SoftCache 实际开发:用软引用做本地缓存 弱引用(Weak Reference) 基本用法 源码级分析:ThreadLocal为什么用弱引用 源码级分析:WeakHashMap的工作原理 实际开发:用WeakHashMap避免监听器泄漏 实际开发:Tomcat的ConcurrentCache 虚引用(Phantom Reference) 基本用法 虚引用 vs finalize():为什么要用虚引用 源码级分析:JDK的Cleaner机制 源码级分析:DirectByteBuffer如何释放堆外内存 实际开发:用虚引用监控资源泄漏 ReferenceQueue:引用回收的通知机制 核心机制 源码级分析:ReferenceHandler线程 实际开发:用ReferenceQueue实现自动清理的缓存 一张图总结 常见问题与解答 Q1:ThreadLocal用弱引用为什么还会内存泄漏? Q2:软引用和弱引用做缓存有什么区别? Q3:虚引用的get()为什么永远返回null? Q4:ReferenceQueue的poll和remove有什么区别? Q5:什么时候该用WeakHashMap? 引言 提到Java的引用类型,很多人脑子里只有一句"强软弱虚",但真到面试或者写代码的时候,往往一问就懵。这篇文章我打算换个思路——不搞概念罗列,直接从JDK源码和实际开发场景出发,把每种引用类型到底解决了什么问题、怎么用的,掰开了讲清楚。 先搞清楚一个前提:可达性分析 在讲引用类型之前,得先明白JVM是怎么判断一个对象该不该回收的。JVM使用的是可达性分析算法:从GC Roots出发,沿着引用链往下找,如果某个对象到GC Roots没有任何引用链可达,那这个对象就是可回收的。 四种引用类型的区别,本质上就是:GC Roots到对象的这条引用链,有多"硬"。 强引用:铁链子,GC死也不断 软引用:橡皮筋,内存不够就断 弱引用:纸糊的,GC一来就断 虚引用:根本不算链子,只是个事后通知 强引用(Strong Reference) 强引用没什么好说的,就是平时写的 Object obj = new Object()。只要引用还在,GC宁可抛OOM也不会回收这个对象。 但强引用有个容易踩的坑——长生命周期对象持有短生命周期对象的引用。比如: public class UserController { // 这是一个长生命周期的缓存,value是强引用 private static final Map<Long, User> userCache = new HashMap<>(); public User getUser(Long userId) { return userCache.computeIfAbsent(userId, id -> loadFromDb(id)); } } 这个 userCache 是 static 的,生命周期跟类一样长。放进去的 User 对象永远不会被回收,哪怕已经没有任何业务代码在使用它了。这就是典型的内存泄漏——对象已经没用了,但因为强引用还在,GC回收不了。 ...

April 15, 2026 · 8 min · 1603 words · WY

Ta4j 框架初学者完整教程

Ta4j 框架初学者完整教程 目录 项目概述与核心架构 什么是 Ta4j? 技术栈与版本 项目组织结构 核心概念详解 BarSeries - 数据容器 Indicator - 技术指标 Rule - 交易规则 Strategy - 交易策略 TradingRecord - 交易记录 实战示例解析 RSI2 策略详解 移动动量策略 时间策略示例 CCI 修正策略 全局极值策略 数据源系统详解 CSV 数据源 JSON 数据源 HTTP 数据源 Bitstamp 数据源 回测系统详解 简单回测示例 步进式回测 雅虎财经回测 回测性能调优 图表系统详解 图表工作流 指标可视化 K线图绘制 交易信号可视化 高级主题 艾略特波浪分析 威科夫分析 数值精度与性能 策略执行日志 最佳实践 代码组织规范 性能优化建议 调试技巧 常见问题解答 学习路径建议 初学者路线 中级开发者路线 高级应用路线 附录 API 快速参考 资源链接 术语表 项目概述与核心架构 什么是 Ta4j? Ta4j (Technical Analysis for Java) 是一个开源的 Java 技术分析库,专门用于金融市场的技术分析和算法交易策略回测。它为开发者提供了一套完整的框架来: ...

April 15, 2026 · 10 min · 2027 words · WY

Ta4j 量化交易框架完整指南:趋势指标解析

指标 说明 典型参数 SMAIndicator 简单移动平均 周期 20 EMAIndicator 指数移动平均 周期 9, 26 WMAIndicator 加权移动平均 周期 14 HMAIndicator 赫尔移动平均(滞后极小) 周期 16 KAMAIndicator 考夫曼自适应移动平均 周期 10, 快慢 EMA JMAIndicator Jurik 移动平均(零滞后) 周期 14 TMAIndicator 三角移动平均(双重平滑) 周期 20 VIDYAIndicator 可变指数动态平均 周期 14 ZLEMAIndicator 零滞后指数移动平均 周期 20 DoubleEMAIndicator 双重指数移动平均 周期 10 TripleEMAIndicator 三重指数移动平均 周期 10 这11个趋势指标大致可以分为三个核心流派:追求响应速度的“反应型”、追求极致平滑的“稳健型”,以及追求两者平衡的“自适应型”。它们的计算逻辑和哲学思考如下。 一、 经典平滑派:速度与稳健的权衡 这类指标是技术分析的基石,它们的差异体现了在“反应速度”和“信号稳健”之间的哲学权衡。 1. 简单移动平均 (SMA, Simple Moving Average) 数学原理: 这是最基础的均线,计算特定周期内的价格算数平均值。每天的价格权重完全一样。 SMA = (P1 + P2 + ... + Pn) / n ...

April 15, 2026 · 3 min · 534 words · WY

从布隆过滤器到 AC 自动机:一个敏感词过滤工具的重写笔记

从布隆过滤器到 AC 自动机:一个敏感词过滤工具的重写笔记 前段时间在做 AI 流式输出的内容审核,需要一套敏感词检测方案。本来想找个现成的库直接用,但后来还是决定自己写一遍——主要是想把里边的原理摸透。这篇文章算是把整个思考过程、踩过的坑和最终的实现串起来,做个记录。 一开始的想法:布隆过滤器 + 词库匹配 第一反应是搞个布隆过滤器。这东西内存占用小,判断“肯定不存在”极快,拿来当第一道筛子很合适。 我很快写了个简单的布隆过滤器,用 MD5 做哈希,加上几个不同的盐值,凑出 k 个哈希函数。然后把敏感词库全塞进去。对于一段文本,如果布隆说过滤器认为“肯定不包含敏感词”,那就直接放行;如果说“可能存在”,再交给后端的精确匹配(比如一个 HashMap 词库)去验证。 测试下来,安全文本的过滤效率确实很高。但我很快就发现了一个致命问题——流式输出。 流式场景下的尴尬 AI 生成内容是逐字往外吐的。假设敏感词是 ab,第一个片段只来了 "a",第二个片段来了 "b"。如果对每个片段单独过布隆过滤器,"a" 不在词库里,放行;"b" 也不在,放行。结果 "ab" 就这么漏过去了。 这个问题不是布隆过滤器独有的。任何无状态的、逐片段独立检测的方案都绕不开。要解决它,必须让检测器记住“刚才已经看到了一个 a,再等等看后面有没有 b”。 也就是说,我需要一个有状态的匹配器。 AC 自动机的救场 后来想起来大学时学过的一个算法——AC 自动机。这东西本来就是为了解决“一次扫描,匹配多个模式串”的问题。而且它天生可以维护状态:匹配完一个片段后,记住当前走到了 Trie 树的哪个节点,下一个片段来了接着往下走。 AC 自动机的结构其实不复杂: 先把所有敏感词建一棵 Trie 树。 然后用 BFS 给每个节点补一条失败指针(fail)。失败指针的作用是,当在当前节点匹配不上下一个字符时,应该跳到哪个节点继续匹配——有点像 KMP 的 next 数组,但搬到了树上。 匹配时,拿着文本的每个字符沿着树往下走,走不通就顺着 fail 跳,走到有输出的节点就记下来。 这个过程是严格 O(n) 的,跟敏感词数量无关。流式场景下,只需要在每次处理完一个片段后把当前节点存下来,下一个片段来了接着用。 我写了一个普通的 AC 自动机实现,用 HashMap 存子节点,结构清晰,调试也方便。对于十万级别的词库,内存占用几十 MB,完全能接受。 分片测试 用之前的例子:敏感词 ["ab", "bc"],分三次喂入 "a"、"b"、"c"。 第一次 "a":状态从根走到节点 a,没有输出。 第二次 "b":从节点 a 走到 ab,输出 "ab"。同时因为 ab 的 fail 指向第一层的 b 节点,而 b 节点本身没有输出,所以只输出一个词。 第三次 "c":当前节点是 ab,没有 c 子节点,于是顺着 fail 跳到 b,发现 b 有子节点 c,走过去到达 bc,输出 "bc"。 完美。跨片段的 "ab" 和 "bc" 都抓到了。 ...

April 15, 2026 · 2 min · 241 words · WY

线程池里用 InheritableThreadLocal 传值,怎么就丢了?

线程池里用 InheritableThreadLocal 传值,怎么就丢了? 你肯定遇到过这种怪事:代码里明明用了 InheritableThreadLocal,信心满满地觉得子线程能自动继承主线程的变量,结果一跑,值没了,或者串了。 我第一次碰到这问题时, debug 了一下午,最后发现是线程池的锅。今天我就把当时挖出来的东西从头捋一遍,包括 Java 源码里到底是怎么拷贝的,还有阿里那个 TransmittableThreadLocal 到底是怎么救场的。 先看 InheritableThreadLocal 是怎么“继承”的 每个 Java 线程,也就是 Thread 类的实例,肚子里都揣着两个 ThreadLocalMap: 一个叫 threadLocals,专门给普通的 ThreadLocal 存变量。 另一个叫 inheritableThreadLocals,给 InheritableThreadLocal 用。 这两个 map 平时都是懒加载的,你第一次 set 的时候才会创建。 当我们 new 一个子线程的时候,事情就发生在 Thread 的 init() 方法里。这个方法会在子线程的构造函数中被调用,关键的一段逻辑是这样的(我摘了简化版的源码): if (parent.inheritableThreadLocals != null) { this.inhertableThreadLocals = ThreadLocal.createInheritedMap(parent.inheritableThreadLocals); } 也就是说,如果父线程(也就是创建子线程的那个线程)的 inheritableThreadLocals 里面有东西,就把整个 map 拷贝一份,作为子线程的 inheritableThreadLocals。 那 createInheritedMap 是怎么拷贝的呢?它实际上是调用了 ThreadLocalMap 的一个特殊构造方法: private ThreadLocalMap(ThreadLocalMap parentMap) { // ... 一些初始化代码 ... for (int i = 0; i < len; i++) { Entry e = parentMap.table[i]; if (e != null) { ThreadLocal<Object> key = (ThreadLocal<Object>) e.get(); if (key != null) { // 注意这一行:调用了 childValue 方法 Object value = key.childValue(e.value); Entry c = new Entry(key, value); // ... 把新 entry 放到子线程的 map 里 ... } } } } 重点就是这个 childValue 方法。它是 InheritableThreadLocal 里定义的一个 protected 方法,默认实现就是直接返回传进来的值: ...

April 15, 2026 · 2 min · 336 words · WY

写作规范

写作规范 文章定位 每篇文章都服务于三个目标: 帮助自己真正理解简历中的技术点。 帮助面试时讲清项目背景、技术方案和取舍。 帮助后续继续扩展为博客、知识库或面试手册。 统一结构 每篇文章默认使用下面的结构,可以根据主题微调: # 标题 ## 1. 对应简历中的哪一段 ## 2. 业务背景是什么 ## 3. 问题为什么会出现 ## 4. 核心技术原理 ## 5. 项目里怎么落地 ## 6. 关键代码或伪代码 ## 7. 常见坑与排查方法 ## 8. 面试官可能怎么追问 ## 9. 推荐回答 ## 10. 延伸学习路线 写作要求 不写纯概念解释,每个概念都尽量落到保险销售、电商交易、商机流转、信创迁移、报表优化或 AI 客服场景。 不把简历写成无法自圆其说的“神话”,遇到不确定的数据用稳妥表达。 技术深度要能支撑资深 Java 面试,尤其要写清楚取舍、风险、边界和排查路径。 代码以伪代码或简化 Java 示例为主,重点说明设计思路。 每篇文章末尾必须有“面试追问”和“推荐回答”。

July 4, 2025 · 1 min · 52 words · WY

面试深挖问题清单

面试深挖问题清单 这个文件用于持续记录简历中每个技术点可能被追问的问题。后续每写完一篇文章,都把关键问题补充进来。 Java 并发与高并发治理 线程池核心参数如何设置?为什么不能直接使用 Executors.newFixedThreadPool? 销售活动高峰时,如何判断瓶颈在线程池、数据库、MQ 还是下游接口? 异步化以后如何保证链路可观测、异常可追踪、结果可补偿? 限流、熔断、降级、隔离分别解决什么问题? CompletableFuture 适合哪些并发编排场景?异常如何统一处理? 本地锁、数据库锁、Redis 分布式锁分别适合什么边界? MQ 削峰后,如何避免消息堆积把问题延后爆发? 月底结算高峰时,哪些链路应该同步返回,哪些链路适合异步化? JVM 调优与线上诊断 Full GC 频繁时,第一步看什么? 如何通过 GC 日志判断是内存泄漏、分配速率过高还是老年代碎片? MAT 里如何定位内存泄漏? Arthas 的 trace、watch、thread 分别适合什么场景? 大 Excel 导出为什么容易 OOM?分页查询和流式写入分别解决什么问题? 线上诊断时如何避免 Arthas 命令对生产系统造成额外压力? 稳定性治理里,接口耗时、线程池、GC、MQ 堆积应该如何联动观察? Spring / MyBatis / 架构升级 Spring3 到 Spring Boot 迁移最容易踩哪些坑? MyBatis 插件机制的拦截点有哪些? AOP + SpEL 做数据权限时如何避免性能问题? Quartz 迁移到 XXL-Job 时如何保证任务不重复执行? WebLogic 到 Undertow 的容器差异主要体现在哪些地方? MyBatis 分页拦截器如何识别和改写不同数据库方言? Spring 事务失效有哪些典型原因? 老系统升级时如何设计灰度、回滚和验收策略? 数据库与信创迁移 Oracle 的 ROWNUM 和 MySQL/OceanBase 的 LIMIT 语义有什么差异? CONNECT BY 迁移到递归 CTE 时如何避免死循环? OceanBase 慢 SQL 如何看执行计划? 新旧 SQL 结果对比工具应该如何设计? Oracle 空字符串和 NULL 的差异会影响哪些业务判断? 存储过程迁移到 Java 服务时,事务边界和批处理性能如何保证? 物化视图适合哪些报表场景?数据新鲜度如何权衡? 关系型数据库和图数据库在人脉关系查询上的边界是什么? 分布式中间件与稳定性 RocketMQ 如何保证消息不丢? 事务消息适合什么场景,不适合什么场景? Kafka 为什么适合行为轨迹链路? Sentinel 的限流和熔断规则如何设计? Seata AT 模式的原理和局限是什么? 消息消费如何保证幂等?重复消费和乱序消费怎么处理? Nacos 配置变更如何避免误发布影响生产? MDC + ELK 如何串起一次跨系统调用? AI 工程化 RAG 如何处理知识过期、权限隔离和召回不准? Function Calling 调业务 API 时如何做权限控制和审计? SSE 和 WebSocket 在 AI 对话场景下如何取舍? MCP 的价值是什么?和普通 API 封装有什么区别? 大模型调用业务接口时,如何防止越权、误操作和敏感数据泄露? AI 客服如何区分“可直接回答”“需要检索”“需要工具调用”“需要人工介入”? OpenClaw 做业务流程自动化时,如何处理失败重试和人工确认? ReAct 在研发效能工具里如何避免无限循环和错误推理扩散?

July 3, 2025 · 1 min · 143 words · WY

简历深挖知识库:资深 Java 金融系统面试手册

简历深挖知识库:资深 Java 金融系统面试手册 这个知识库围绕周维扬简历中的真实项目经历展开,目标不是堆概念,而是把每个简历亮点拆成“能理解、能复盘、能讲清、能被追问”的技术文章。 写作目标 把简历中的关键技术点系统化,形成长期可复习的个人知识库。 每篇文章都要能支撑一次 10 到 20 分钟的面试深挖。 每个专题都要结合保险销售、电商交易、商机流转、信创迁移、报表优化、AI 客服等真实业务背景。 避免空泛八股,强调项目场景、技术取舍、落地步骤、排查路径和面试回答。 专题规划 01. Java 并发与高并发治理 线程池在保险销售高峰场景中的设计与调优 JUC 核心工具详解:CountDownLatch、Semaphore、CompletableFuture、BlockingQueue 锁机制详解:synchronized、ReentrantLock、读写锁与分布式锁的边界 MQ 削峰填谷在商机流转系统中的落地 异步化改造:从同步调用到事件驱动 高并发场景下的限流、降级、熔断与隔离 月底结算与营销活动高峰的稳定性设计复盘 02. JVM 调优与线上诊断 JVM 内存模型与保险业务系统常见内存问题 GC 日志如何看:从 Full GC 频繁到问题定位 堆 Dump 分析实战:如何定位内存泄漏 Arthas 在线诊断实战:trace、watch、jad、thread、dashboard 大 Excel 导出 OOM 的原因、排查与优化 生产环境稳定性治理:指标、告警、日志与应急流程 03. Spring / MyBatis / 遗留系统升级 Spring3 到 Spring Boot 迁移的关键问题与改造路径 WebLogic 到 Undertow:容器迁移中的兼容性问题 MyBatis 执行流程与插件机制详解 MyBatis 拦截器实现分页 SQL 自动转换 AOP + SpEL 实现动态数据权限 Spring 事务机制与保险业务一致性问题 Quartz 扩展与 XXL-Job 迁移实践 04. 数据库与信创迁移 Oracle 到 OceanBase 信创迁移整体方法论 ROWNUM 到 LIMIT:分页语义差异与改造方式 CONNECT BY 到递归 CTE:树查询迁移详解 Oracle 空字符串、函数、日期、序列兼容问题 OceanBase 执行计划与慢 SQL 优化 物化视图、索引设计与报表性能优化 新旧 SQL 与存储过程结果对比工具设计 从关系查询到图数据库:Neo4j 调研与适用边界 05. 分布式中间件与稳定性 RocketMQ 在商机流转系统中的解耦设计 RocketMQ 事务消息与最终一致性 Kafka 在客户行为轨迹链路中的使用 Sentinel 限流熔断在营销活动中的落地 Seata AT 模式在资金划扣场景中的使用 Nacos 配置中心与服务注册实践 MDC + ELK 全链路日志系统建设 06. AI 工程化与传统业务系统接入 公司内部 AI 客服系统整体架构设计 RAG 在保险产品问答中的落地方式 Function Calling 如何安全调用业务 API MCP 思想与业务工具标准化封装 SSE 流式响应在 AI 对话系统中的使用 OpenClaw 在保全操作自动化中的应用 Spring AI / AgentScope / ReAct 在研发效能工具中的实践 第一批文章 第一批先完成每个专题的核心文章,用来确定深度、结构和风格: ...

July 2, 2025 · 1 min · 204 words · WY

如何使用这套资料

如何使用这套资料 这套资料不是普通博客合集,而是围绕简历构建的个人技术深挖手册。建议按下面的方式使用。 1. 先从简历句子开始 每篇文章都对应简历中的一句或几句描述。复习时不要先背概念,而是先问自己: 这句话在简历里对应哪个项目? 当时业务为什么需要这个能力? 如果没有这个方案,会出现什么问题? 我在里面负责什么? 这个技术点能不能讲清楚取舍和边界? 2. 再补技术原理 项目经历是入口,技术原理是支撑。面试官通常会从项目追到原理: 你为什么这么设计? 有没有其他方案? 这个方案的缺点是什么? 出问题怎么排查? 数据量或并发量再扩大十倍怎么办? 所以每篇文章都要同时看“业务背景”和“核心原理”。 3. 最后练推荐回答 每篇文章的“面试追问”和“推荐回答”用于口述训练。建议不要逐字背,而是练成三段式: 先讲业务背景。 再讲技术方案。 最后讲结果、风险和后续优化。 例如回答“你们线程池怎么设计”时,不要直接背核心参数,而是从销售活动高峰、下游隔离、队列堆积、拒绝策略、监控告警讲起。 4. 复习顺序建议 第一轮按项目价值复习: Oracle 到 OceanBase 信创迁移 保险销售系统遗留架构升级 B2B 商机管理与 RocketMQ 解耦 海量报表优化与 JVM/OOM 排查 AI 客服系统整体架构 第二轮按技术专题复习: Java 并发与线程池 JVM 与 Arthas Spring / MyBatis / 迁移改造 数据库与 SQL 优化 中间件与稳定性 AI 工程化 第三轮按面试追问复习: 每天挑 5 个问题,用 3 分钟口述回答。 回答时必须包含背景、方案、结果、风险。 说不清楚的问题,回到对应文章补知识点。

July 1, 2025 · 1 min · 68 words · WY