自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(41)
  • 收藏
  • 关注

原创 Redis 有哪些常见数据结构?它们的底层实现和使用场景是什么?

本文总结了Redis 7.0+常见面试问题,重点分析了五种基本数据类型的底层实现与使用场景。String使用SDS实现,支持O(1)长度查询和动态扩容;List采用quicklist结构,结合了链表与listpack的优势;Hash存储小对象使用listpack,大对象使用hashtable;Set在元素较少时使用intset,否则转为hashtable;ZSet通过listpack或skiplist+dict实现有序存储。文章详细解析了SDS、listpack、quicklist等核心数据结构的特点,并对

2026-08-02 23:48:04 200

原创 Learn Claude Code:CodeAgent 与后端程序大搭配——定时任务、Git Worktree 和MCP 服务

摘要 本文探讨了AI工程化扩展的四个关键问题及解决方案:后台任务解决慢操作阻塞问题,Cron系统实现定时任务调度,Git Worktree隔离并行修改,MCP协议标准化外部工具接入。这些模块共同构成了AI系统的工程化基础,使Agent从演示原型发展为生产级应用。文章详细分析了各模块的设计思路、实现要点和组合方式,强调"模型决策、系统执行"的工程原则,为构建可靠、可扩展的AI运行环境提供了系统化框架。

2026-08-02 22:29:18 345

原创 Learn Claude Code:CodeAgent 的状态机流程编排——Todo任务系统和自主智能体

本文系统探讨了多Agent系统的四个核心层级及其关键问题:1. Todo系统作为单个Agent的执行规划工具;2. Task System实现持久化任务管理和依赖关系;3. Subagent用于隔离执行子任务;4. Agent Team实现长期协作。文章指出多Agent系统的真正挑战在于任务管理、状态同步、通信机制、权限控制和文件冲突解决,而非简单的并发调用。作者通过类比线程池、Actor模型等计算机科学概念,提出了包括任务原子认领、权限冒泡、Worktree隔离等工程实现方案,强调确定性的系统设计优先于事

2026-08-02 22:26:58 358

原创 Learn Claude Code:CodeAgent 的灵魂——上下文管理

本文探讨了如何优化AI编码代理(Coding Agent)的上下文管理系统,以解决上下文窗口受限问题。作者提出"上下文工程"概念,强调信息分类存储和按需加载策略,将上下文信息分为静态规则、能力目录、当前工作、压缩摘要和长期记忆五类。系统采用分层压缩策略,从廉价操作(文件落盘、历史裁剪)到昂贵操作(LLM摘要)逐步执行。长期记忆通过结构化文件存储关键事实,而非简单使用RAG。文章还讨论了运行时组装System Prompt、错误恢复机制等实践建议,最终提出一个多层级的上下文系统架构,实现规则稳定、任务清晰、历

2026-08-02 22:24:45 422

原创 Learn Claude Code:CodeAgent 的最小架构——工具+权限+Hook扩展钩子

这篇文章探讨了构建Coding Agent的最小核心系统,重点分析了Agent循环、工具系统、权限控制和钩子机制四个关键模块。文章指出,一个可用的Agent内核远不止简单的循环结构,而是需要建立完善的协议闭环:Agent Loop通过工具调用和结果反馈实现持续交互;工具系统通过Schema定义和函数注册实现能力扩展;权限系统通过多层验证机制确保操作安全;Hook机制在不污染核心逻辑的前提下支持功能扩展。作者强调,优秀的设计应保持核心循环简单稳定,通过工具扩展能力,通过确定性代码实现安全,并通过边界控制防止无

2026-08-02 22:19:56 363

原创 Virtual Thread 优化 Spring AI 阻塞式 LLM I/O:对照压测报告

Virtual Thread 优化 Spring AI 阻塞式 LLM I/O 测试摘要 本测试对比了固定线程池和Virtual Thread在执行Spring AI阻塞式LLM调用时的性能差异。测试模拟1500ms固定响应时间,覆盖10-500并发场景,共完成206,400次请求。 核心发现: 500并发时,Virtual Thread使吞吐量从21.24 req/s提升至325.52 req/s P95延迟从24.14s降至1.52s 执行时间保持稳定(1.51s),性能提升源于消除线程池排队 测试全程

2026-08-01 22:26:32 194

原创 大模型知识科普——多模态大模型原理:文本、图像与音频如何统一理解?

多模态大模型通过视觉编码器将图片转换为向量序列(视觉Token),再经模态对齐模块映射到语言模型空间进行推理。核心流程为:图片→视觉编码→Token化→模态对齐→LLM处理。这种设计使其擅长高层语义理解,但在处理长截图、小字识别和精确计数时易出错,主要由于视觉Token压缩导致细节丢失、缩放模糊等问题。模型本质是将非文本信息转化为Transformer可理解的序列表示,而非精准的视觉识别工具。

2026-08-01 21:46:01 254

原创 大模型知识科普——稠密模型、稀疏模型与 MoE 架构有什么区别?

MoE(混合专家)模型通过解耦总参数和单token算力,实现计算效率提升而非显存节省。其核心机制是每个token仅激活top-k专家进行计算,而所有专家仍需驻留显存。例如Mixtral-8x7B总参47B,显存占用与稠密模型相当。大模型(如DeepSeek-V3 671B/37B)普遍采用MoE提升吞吐,而小模型(<14B)仍以稠密为主。MoE优势在于数据中心场景的$/token经济性,但本地部署更推荐稠密模型。关键区别在于:稠密模型全员参与计算,MoE选择性激活专家,虽省算力却需完整显存支持。当前趋势显示

2026-08-01 21:26:57 636

原创 AI 应用开发——如何确保大模型输出标准的JSON文本?

大模型JSON输出优化的五层防御体系 摘要:大模型输出JSON时容易出现结构性错误、字段幻觉等问题,需采用五层防御体系保障输出质量:(1)优先使用模型原生结构化输出能力(如OpenAI的json_schema严格模式);(2)自部署模型采用约束解码技术(如Outlines/XGrammar);(3)提示工程加入Schema和Few-shot示例;(4)后处理层进行提取修复校验;(5)重试兜底机制。核心原理是通过语法约束在token采样阶段屏蔽非法选项,配合全链路校验,将JSON错误率从20%降至接近0。建议

2026-08-01 21:15:07 411

原创 Golang速通(Javaer版)——从基础语法到并发模型

这篇文章总结了Go语言的基础语法要点,包括:变量和常量变量类型需要显式转换常量分为无类型常量和显式类型常量使用iota实现枚举功能控制流语句if语句不需要括号,支持初始化语句switch默认不穿透,需用fallthrough显式穿透只有for循环,可省略条件变成"伪while"循环复杂数据类型切片(Slice)本质是结构体,传递高效动态扩容策略:小容量翻倍,大容量平滑增长切片是数组的视图,修改会影响原数组哈希表(Map)的多种声明方式,nil map可读取但不

2026-06-08 12:52:10 439 1

原创 UU远程(UURemote)连接超时问题排查全记录

自己排除问题的记录1——UU远程异常显示,但是实际上不影响直接远程使用,但是没有办法直接连接我的MacBook,因此开始尝试修复问题

2026-06-08 01:01:55 862

原创 Java迭代器的 fail-fast 机制——为什么遍历时不能直接 remove?

本文对比了Java和Go语言在遍历集合时删除元素的差异。Java通过fail-fast机制(基于modCount和expectedModCount计数器)在检测到并发修改时会立即抛出ConcurrentModificationException异常,避免数据错乱。而Go语言由于设计哲学追求轻量,其range循环没有内置这种检查机制,需要开发者自行注意迭代安全。文章详细剖析了Java fail-fast的实现原理,解释了为何不能直接使用集合的remove方法而必须通过迭代器的remove操作,并提供了正确的删

2026-06-03 11:31:50 250

原创 DCL 双重检查锁——为什么必须使用 volatile?

这篇文章分析了双重检查锁定(DCL)实现单例模式时存在的问题及解决方案。关键点包括:1. DCL存在指令重排序隐患,可能导致返回未完全初始化的对象;2. 问题根源在于new操作的非原子性及可能的1-3-2执行顺序;3. 两种解决方案:使用volatile禁止重排序,或采用更优雅的静态内部类/枚举实现。静态内部类通过类加载机制保证线程安全,枚举则能防御反射和反序列化攻击。文章通过字节码层面解释了问题本质,并提供了代码示例说明解决方案。

2026-06-03 11:11:12 323

原创 4.17小厂HR面

摘要:本文复盘了一次失败的HR面试经历,总结了面试中涉及的13个核心问题,包括个人背景、求职动机、职业规划、技术能力等。候选人反思了面试中的失误,如表达不够严谨、态度略显轻视、未能展现稳定性等。同时指出了该岗位的诸多不足:C#技术栈、无转正机会、低薪资、偏远工控方向,认为对互联网职业发展不利。最后得出经验:面试中应多强调适配性,引导话题方向,避免过早暴露真实想法。这次经历为未来的HR面试提供了宝贵教训。

2026-05-19 20:24:12 262

原创 3.9字节 DataLeap 部门日常实习一面

字节跳动大数据开发实习面试复盘:面试围绕技术基础、项目经历和算法能力展开。技术考察包括Java并发(线程创建、sleep/wait区别)、RPC框架实现(Netty应用、动态代理、零拷贝)、线程池配置等;项目深挖重点询问自研RPC框架的技术细节;算法题考察代码相似度判断。面试官肯定项目独立完成度,指出需提升技术总结能力、表达条理性和编码调试效率。建议加强日常技术沉淀,注意避免在面试中提及负面实习经历。整体反映实习生需具备扎实的技术基础、清晰的项目表达和快速解决问题的能力。

2026-05-19 20:13:12 372

原创 4.16滴滴 AIOT 一面|面经

本文总结了技术面试的核心内容与反思。面试涵盖操作系统(页表映射、中断流程)、网络(Reactor模型、Netty零拷贝)、并发(AQS、CAS)、MySQL(MVCC机制)、AI(RAG流程)等知识点,重点考察了自研RPC协议设计与性能优化实践。面试官评价基础扎实但算法实现速度不足,虽思路正确但未能在限定时间完成棋盘最短路径问题(需计算max(|dx|,|dy|)步数并组合方向移动)。反思指出滴滴面试存在等待时间长、环境嘈杂等问题,同时承认算法实现能力有待提升。整体呈现了典型技术面试的知识广度与深度考察,以

2026-05-19 20:06:07 307

原创 3.20字节云部门一面|面经

摘要:本文记录了技术面试全过程,涵盖RPC框架、Netty、零拷贝、TCP协议等底层原理探讨,以及项目落地和算法题表现。面试官肯定了候选人的技术深度,但指出知识广度不足,建议加强网络、操作系统等基础,并强调要深入理解技术设计原理而非死记硬背。虽然面试交流深入愉快,但因算法表现不佳最终未通过。反思指出需提升算法能力,并善用AI工具进行技术追问以建立系统性认知。

2026-05-19 20:00:33 399

原创 4.15腾讯 CSIG云服务产线 一面

这是一次不太愉快的Java开发岗位面试经历。面试内容主要围绕八股文展开,涉及Go语言基础、Spring AOP、JVM、并发编程、线程池、Redis、MySQL等技术点。面试官采用引导式提问,但候选人反映问题表述不够清晰,且面试压力较大。算法题要求合并有序数组并控制空间复杂度,因题目条件不完整导致发挥不佳。最终反馈认为候选人知识面广但缺乏系统性输出,需要引导才能深入细节。整体面试体验较差,主要问题在于面试官预设答案的提问方式和高压氛围,且过于侧重八股文而忽略项目经历。一面后很快收到拒信。

2026-05-18 16:16:14 365

原创 3.5字节广告部门一面面经

摘要:这是一次技术面试复盘,主要考察了实习项目经历和技术基础。面试官深入追问了酒店数据整合项目的技术细节,包括数据匹配逻辑优化和性能提升方案;探讨了智能面试系统项目中消息队列选型和RAG实现原理;对比分析了自研RPC框架的特点。编程测试环节考察了SQL和Java多线程实现,面试者反思基础不够扎实。最终因技术基础薄弱未能通过面试,建议不要用大厂面试练手,需扎实掌握每个技术细节。

2026-05-18 15:56:16 257

原创 Python 并发模型理解:GIL、线程、async 到底是什么关系

摘要:Python与Java在并发模型上存在显著差异,主要源于CPython解释器的GIL(全局解释器锁)限制。GIL确保同一时刻仅一个线程能执行Python字节码,导致多线程在CPU密集型任务中效率低下,但适用于I/O密集型场景。解决方案包括多进程(每个进程独立GIL)和异步编程(async/await)。相比之下,Java采用可达性分析的GC机制,无需GIL。Python的GIL源于引用计数的线程安全需求,移除困难。FastAPI中同步与异步函数的处理方式也体现了这一差异。

2026-05-17 23:48:46 465 1

原创 动态规划专题Day1——打家劫舍系列

本文总结了作者复习动态规划算法的过程,重点分析了四道打家劫舍系列题目(LC70、198、213、337)的解题思路和常见错误。作者发现自己在初始化dp数组时容易出错,如爬楼梯问题中dp[0]的取值逻辑、打家劫舍问题中dp[1]的计算方式等。对于环形房屋问题(LC213),作者通过分类讨论转化为线性问题,但需注意边界条件。树形打家劫舍问题(LC337)则采用递归解法,强调子节点选择时的最优决策。这些题目展现了动态规划从一维到环形再到树形的递进关系,核心都是"选/不选"两种状态的转移。

2026-05-17 23:19:11 416 1

原创 线程池和线程池常见的参数

核心线程数(固定不销毁)、最大线程数(阻塞队列满了之后创建临时救场的线程,用完就销毁|最大线程数=核心线程数+临时线程数)、阻塞队列(暂时存储任务,决定线程池吞吐能力)、拒绝策略(阻塞队列满了而且最大线程数也到了,对后续的任务所采用的策略)

2026-05-12 21:35:36 385

原创 Java集合类型主要有哪些?以及各自原理

Collection(存储单一元素)和Map(存储键值对)。

2026-04-14 22:27:08 348 1

原创 JVM 是如何判断一个对象是“垃圾”的?(引用计数 vs 可达性分析)

• 引用计数:每次引用计数一下,没有引用就可以释放(需要添加额外的逻辑来处理循环依赖引用)→Python• 可达性分析:从ROOT对象开始搜索,搜不到的就都可以回收→Java。

2026-04-14 22:25:48 56

原创 B树 vs B+树(MySQL为什么选择了B+树)

B树和B+树在数据结构设计上存在显著差异。B树所有节点都存储数据,查询性能不稳定,且范围查询效率低;而B+树只有叶子节点存储数据,非叶子节点仅存储索引键,通过双向链表连接叶子节点,使得查询性能稳定、范围查询高效。B+树通过牺牲非叶子节点的存储空间换取更高的扇出率,将树高压缩到3-4层,大幅减少磁盘IO次数。这种设计使B+树特别适合数据库等需要频繁读写和范围查询的场景,成为主流数据库索引结构的首选。

2026-02-28 11:22:19 85

原创 Redis分片集群和一致性哈希的区别

Redis采用哈希槽(Hashslot)机制实现数据分片,将存储空间划分为16384个固定槽位,通过CRC16算法计算Key的槽位值。相比一致性哈希的直接Key-Node映射,Redis采用Key-Slot-Node两级映射,通过人工指定槽位分配实现更灵活的负载均衡。一致性哈希存在数据倾斜风险且扩缩容困难,而哈希槽以固定槽位为单位进行数据迁移,边界清晰且元数据同步开销小。Redis选择哈希槽机制主要因其更适合有状态分布式数据库场景,能保证数据安全性和扩展性,而一致性哈希更适用于无状态负载均衡场景。

2026-02-27 14:36:56 652

原创 Spring Boot自动装配原理总结

摘要:SpringBoot自动配置基于"约定优于配置"原则,通过@EnableAutoConfiguration注解和条件加载机制实现。其核心流程为:读取META-INF下的配置文件加载候选配置类,利用@Conditional系列注解进行过滤,最终将符合条件的配置类注册到IOC容器。配置参数通过@ConfigurationProperties绑定到JavaBean,支持YML文件覆盖默认值。自动配置类通过SPI机制发现,SpringBoot2.x读取spring.factories,3.

2026-02-27 14:23:12 340

原创 16位反码求和、奇偶校验与CRC——原理及计算过程

本文介绍了网络协议中常见的校验机制,包括IPv4、TCP、UDP、ICMP使用的16位反码求和算法,以及链路层的CRC校验。16位反码求和通过分块、求和、回卷进位和取反操作生成校验和,接收方通过验证全1结果判断数据完整性。CRC则采用模2运算(XOR)进行更严格的校验,由硬件高效完成。两种校验方式各有侧重:反码求和简单高效,CRC检错能力更强,但都不能防止数据篡改。文章通过具体计算示例详细说明了两种校验方法的实现过程。

2026-02-13 16:12:02 752

原创 MIT6.s081——lab4 trap调用实现用户态和内核态的切换

本文摘要: RISC-V函数调用参数传递:a0-a7寄存器用于传递参数,在printf调用中a0传递格式字符串,a1和a2分别传递参数值。 函数调用优化:编译器会内联简单函数(如f和g),直接计算结果而不生成调用指令。 小端存储影响:通过示例分析57616和字符变量i的输出结果,说明小端存储模式下字节顺序对输出的影响。 格式字符串问题:当参数不足时,printf会读取栈上的随机值,导致未定义行为。 回溯功能原理:通过栈帧(包含返回地址和调用者帧指针)实现函数调用链追踪,用于调试目的。

2026-02-13 13:37:32 671

原创 MIT6.s081——lab3虚拟内存的结构和pgtl的实现

本文摘要探讨了在xv6操作系统中通过共享只读内存区域来加速getpid()系统调用的方法。关键思路是在用户空间和内核之间映射一个包含进程PID的只读页面USYSCALL,使用户程序可直接读取而无需陷入内核。实现需要修改三个核心函数:allocproc()分配并初始化页面,proc_pagetable()建立页表映射,freeproc()释放页面。该方法不仅提升了getpid()性能,也为其他只读系统调用(如uptime)的优化提供了参考模式。实验通过ugetpid测试验证优化效果,展示了用户态与内核态数据共

2026-02-12 13:56:20 572

原创 MIT6.s081——lab2 系统调用的创建

本文介绍了在xv6操作系统中添加系统调用和进行内核调试的方法。主要内容包括:1) 使用gdb调试xv6内核,包括设置断点、查看堆栈回溯和寄存器状态;2) 通过实验分析系统调用执行流程,包括从用户态到内核态的转换过程;3) 实现一个trace系统调用,用于跟踪指定系统调用的执行情况。文章详细展示了如何利用gdb工具调试内核代码、分析系统调用参数传递机制,以及如何通过修改内核代码来添加新的系统调用功能。

2026-02-12 13:51:45 658

原创 MIT6.s081——lab1 实现常见的用户程序

本文介绍了在xv6操作系统中实现几个经典UNIX用户程序的方法,包括sleep、pingpong、primes、find和xargs。这些程序分别展示了系统调用的使用、进程间通信、并发编程和文件系统操作等核心概念。sleep程序通过系统调用实现定时休眠;pingpong利用管道实现父子进程间的通信;primes使用管道和fork实现并发质数筛;find程序递归遍历目录树查找文件;xargs则将标准输入转换为命令行参数。实现时需要注意正确处理命令行参数、管理文件描述符、处理进程间同步以及递归逻辑等细节。这些程

2026-01-05 23:13:05 902

原创 JDK17集合源码阅读——HashSet+HashMap

摘要:HashSet基于HashMap实现,底层使用HashMap存储元素,其中键为元素值,值为固定虚设对象PRESENT。HashMap采用数组+链表+红黑树结构,默认容量16,负载因子0.75,当链表长度≥8且数组长度≥64时会转为红黑树。扩容时容量翻倍,通过(n-1)&hash计算索引位置。哈希冲突时采用拉链法,JDK1.8后引入红黑树优化查找效率。HashSet本质上是一个只使用Key的HashMap,通过HashMap的特性实现集合的唯一性和无序性。

2025-12-24 21:03:16 941

原创 JDK17集合源代码阅读——LinkedList

摘要:LinkedList实现了List和Deque接口,采用双向链表结构,维护头尾指针和节点数。其节点类包含前后指针,支持高效的双端操作。构造方法简单,核心操作如addAll实现了链表拼接功能。作为List、Queue和Deque使用时,分别提供添加/获取、入队/出队、压栈/弹栈等方法。虽然功能全面,但由于链表遍历效率低且非线程安全,JDK8后更推荐使用ArrayList。LinkedList在JDK1.7取消了循环链表设计,相比数组结构在快速构建场景更具灵活性。

2025-12-24 19:15:11 336

原创 JDK17集合源码阅读——Vector

Java中的Vector是早期版本(1.0)提供的线程安全集合类,基于Object数组实现。其特点是方法同步(synchronized)但性能较差,默认容量10,支持指定扩容步长(capacityIncrement),未指定时默认翻倍扩容。与现代集合(如ArrayList)相比,Vector采用protected字段设计便于继承,但存在空间浪费问题。由于同步机制无法保证复合操作安全且性能低下,现代开发已不推荐使用Vector,建议改用Collections.synchronizedList等替代方案。

2025-12-23 16:13:19 276

原创 JDK17集合源码阅读——ArrayList

ArrayList是基于动态数组实现的列表结构,默认容量为10,支持动态扩容(1.5倍增长)。它实现了List、RandomAccess等接口,提供快速随机访问能力。关键特性包括:1)扩容机制通过grow()方法实现,性能开销大,建议初始化时指定容量;2)线程不安全,多线程环境需同步处理;3)迭代时修改会触发快速失败机制;4)subList()返回的是原列表视图而非独立副本;5)允许存储null值但不建议使用。ArrayList适合尾部操作频繁的场景,但中间/头部操作效率较低。

2025-12-23 16:02:18 451

原创 KMP算法

KMP算法是由Knuth、Morris和Pratt三位学者发明的字符串匹配算法,其核心是前缀表(next数组)。该表记录模式串中各位置的最长相同前后缀长度,用于匹配失败时确定子串回退位置。计算前缀表时,逐个比较前后缀字符,匹配则长度加1,不匹配则回退到前一个匹配点。使用next数组可避免主串回溯,将时间复杂度优化至O(M+N)。算法通过动态规划思想构建next数组,利用已知匹配信息减少重复比较,显著提升匹配效率。

2025-11-22 15:39:24 894

原创 使用MacOS配置MIT6.S081的环境

摘要:在MacOS上运行XV6实验时,2020版本存在较多问题,包括环境配置复杂、路径查找困难以及运行时报错,最终无法进入内核。切换到2022版本后问题有所改善,但仍需修改user/usertests.c中的代码才能成功运行。建议直接使用2022版本进行实验,并注意环境配置和代码调试。

2025-11-02 15:27:52 279

原创 C++底层内存机制——栈和堆详细解析

因为很多同学对内存的使用是很困惑的,不知道什么是栈空间什么是堆空间,也不知道变量在内存里的具体分配是什么样子的,这个文章主要是来解释两种内存的区别的——栈上是从上到下按照顺序来的,堆是随机的根据内存大小来进行的(这一部分的底层实现和原理要涉及计算机组成原理和汇编语言,实在不等可以等以后就知道了)在我们进行空间的申请的时候,栈和堆的申请逻辑是不一样的,栈是根据顺序来进行申请的,因此我们才不需要用指针来进行指向,但是堆是去空余空间的表里面进行空间的查找,找到了就进行分配。

2025-10-09 21:01:09 392

原创 C语言快速入门——基础语法、指针与内存管理笔记

重点阐述了C语言的基本程序结构、编译运行环境配置方法,以及数据类型分类(基本类型、枚举、void和派生类型),特别说明了整数类型在不同平台下的差异和浮点类型的标准规范。最后提及void类型在函数返回、参数传递和指针应用中的关键作用。

2025-10-09 20:49:47 570

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除