- 博客(127)
- 收藏
- 关注
原创 深入理解 Java 虚拟机-04 垃圾收集器
本文介绍了Java虚拟机的垃圾收集器及其特点。JDK9后默认使用G1收集器,废弃了Serial/CMS等组合。垃圾回收存在"Stop The World"问题,不同收集器在吞吐量和延迟之间各有侧重。Serial是单线程收集器,ParNew是其多线程版本。Parallel Scavenge注重吞吐量,CMS追求低延迟,采用并发标记清除算法。G1收集器开创了基于Region的内存布局,支持设定停顿时间目标,通过优先级列表选择回收区域。
2026-01-28 15:45:01
959
原创 深入理解 Java 虚拟机-03 垃圾收集
Java垃圾收集机制概述 Java垃圾收集(GC)是自动内存管理机制,主要关注堆和方法区的内存回收。判断对象可回收采用可达性分析算法,从GC Roots出发检查引用链。回收算法包括: 标记-清除:基础算法,但会产生内存碎片 标记-复制:用于新生代,采用Eden和Survivor区设计 标记-整理:用于老年代,解决碎片问题 Java堆采用分代收集理论,划分为新生代和老年代,针对不同代使用不同算法。新生代对象大多短命,适合复制算法;老年代对象存活率高,适合整理算法。跨代引用通过记忆集机制处理。
2026-01-27 11:20:27
569
原创 深入理解 Java 虚拟机-02 对象
本文详细介绍了Java虚拟机中对象的内存布局、创建过程和访问方式。对象在堆内存中由对象头、实例数据和对齐填充三部分组成,对象头包含运行时数据和类型指针。创建对象需经历类加载检查、内存分配、初始化和构造方法调用等步骤。对象访问定位主要有句柄和直接指针两种方式,HotSpot主要采用直接指针访问。此外,64位JVM通过压缩指针技术将对象指针压缩为32位以减少内存占用,该技术在堆内存≤32GB时默认开启。
2026-01-26 17:15:10
643
原创 Linux JDK NIO 源码分析
本文分析了Linux下JDK NIO的实现机制,探讨了epoll多路复用模型的核心原理与代码实现。文章首先解释了epoll作为观察者模式在内核中的工作流程,包括事件监听和就绪队列机制。随后通过Java NIO示例代码,深入剖析了Selector.open()的底层实现,详细追踪了从SelectorProvider加载到最终创建EPollSelectorImpl的过程。分析展示了Linux系统如何通过epoll_create、epoll_ctl和epoll_wait等系统调用实现高效的事件驱动I/O处理。
2026-01-23 17:27:18
701
原创 深入理解 Java 虚拟机-01 JVM 内存模型
本文介绍了Java虚拟机(JVM)的内存模型,主要包括五个运行时数据区域:程序计数器(线程私有,记录执行指令地址)、Java虚拟机栈(线程私有,存储方法调用的栈帧)、本地方法栈(执行Native方法)、堆(线程共享,存储对象实例)和方法区(线程共享,存储类信息、常量等)。其中堆是垃圾回收的主要区域,方法区在JDK8后被元空间取代。此外还提到了直接内存(NIO使用的堆外内存)。每个区域都有其特定功能,当内存不足时会抛出不同异常(如OutOfMemoryError或StackOverflowError)。
2025-12-30 16:51:32
980
原创 链表与LinkedList
本文介绍了链表数据结构及其在Java中的实现。链表通过节点指针连接元素,不要求连续内存空间,但存储效率低于数组。双向链表节点包含前后指针,便于插入删除操作。Java的LinkedList类实现了双向链表,使用首尾节点指针简化操作。相比数组,链表在指定位置操作效率高(O(1)),但查找性能较差。实际应用中需权衡链表和数组(如ArrayList)的特性,考虑内存分配、遍历方式等因素。特别强调LinkedList遍历应使用迭代器而非普通for循环以保证性能。
2025-12-27 21:48:48
704
原创 数组与ArrayList
文章讲述了数组的概念,介绍 Java 的 ArrayList 基于数组实现,支持动态扩容,提供便捷 API,但非尾部操作效率较低,还解释了数组下标从 0 开始的原因以及 ArrayList 的序列化机制。
2025-12-26 16:29:31
258
原创 Spring Core常见错误及解决方案
一些`Spring Core 常见错误及解决方案,出自极客时间傅健老师《Spring编程常见错误50例》
2025-12-01 14:28:53
1032
原创 Kafka-4 Kafka 中的消费者
本文介绍了 Kafka 消费者的核心概念和使用方法。重点讲解了消费者组 (Consumer Group) 的特性,包括组内消费者实例与分区分配规则,重平衡的产生和避免措施、位移提交等。
2025-12-01 14:22:39
893
原创 Kafka-3 Kafka 中的生产者
本文详细分析了 Kafka 生产者的核心机制,包括分区选择、消息缓存、消息确认、幂等性、事务性等,并提供了一些配置项的最佳实践。
2025-11-29 14:13:47
762
原创 Mysql 的锁机制
MySQL锁机制主要分为全局锁、表级锁和行锁三类,用于控制并发访问。全局锁用于全库只读备份,InnoDB引擎通过事务支持非阻塞备份。表级锁包括表锁和元数据锁(MDL),MDL锁协调DML与DDL操作冲突。行锁是InnoDB特有,记录锁锁定索引记录,间隙锁防止幻读,临键锁则是记录锁与间隙锁的组合。行锁在事务结束时释放,遵循两阶段锁协议。合理使用锁能保证数据一致性,同时需注意锁粒度对性能的影响,如避免无索引更新导致全表锁定。
2025-11-08 23:20:05
679
原创 Mysql 读书笔记
本文总结了MySQL使用中的几个关键知识点:1)索引失效的常见场景,如字段运算、隐式转换、模糊查询等;2)字符串索引的实现方式,包括前缀索引和哈希索引;3)MySQL性能抖动原因,主要是脏页刷新机制;4)数据删除后空间不释放的原理;5)count()函数的执行效率比较;6)排序操作的全字段和Row_ID两种算法;7)自增主键不连续的原因。
2025-11-03 15:46:19
758
原创 深入浅出 Mysql 索引
MySQL索引通过高效数据结构优化查询性能。B+树是主流索引实现,相比B树具有非叶子节点仅存关键字、叶子节点双向连接等优势,支持稳定查询和高效范围查找。索引数据页采用槽(slot)机制实现二分查找,提升I/O效率。索引覆盖避免回表操作,联合索引遵循最左前缀原则。5.7版本后引入索引下推优化,能在索引层过滤数据。理解这些机制有助于合理设计索引,平衡查询效率和存储开销。
2025-10-30 17:32:22
443
原创 谈谈数据库的事务实现
本文通过具体案例,阐述了不同隔离级别下的数据读取差异,并指出可重复读在事务开始时生成固定ReadView的特性。文章还探讨了事务并发操作时的版本控制过程,解释了如何通过undo log回溯历史版本数据,以及不同隔离级别解决并发问题的原理。最后通过事务操作实例,展示了MVCC机制在复杂并发场景下的具体工作流程。
2025-10-29 16:31:49
711
原创 谈谈数据库中的自增主键
自增主键相比身份证号等业务主键的优势在于:1) 占用空间更小(4字节vs18字节),减少索引存储开销;2) 插入时索引调整更少(仅末端插入),符合磁盘读写特性;3) 有序性支持高效范围查询。但业务唯一性约束是前提,若无法保证仍需使用业务主键。自增主键通过优化索引结构和维护成本,提升了数据库性能。
2025-10-28 11:00:26
345
原创 23 种设计模式总结
设计模式分为创建型、结构型、行为型三大类,共23种常用模式。创建型模式(如单例、工厂)解决对象创建问题;结构型模式(如代理、装饰器)处理类或对象组合;行为型模式(如观察者、策略)管理对象间交互。每种模式针对特定场景,通过封装变化、解耦代码提升系统灵活性和可维护性。设计模式本质是前人总结的代码复用经验,合理运用能有效解决复杂软件设计问题。
2025-10-23 15:20:21
349
原创 微服务核心
微服务架构是一种将应用拆分为多个小型服务的架构风格,具有独立进程、轻量通信、业务导向等特点。其优势在于模块化、独立部署和技术多样性,但也面临分布式复杂性、数据一致性等挑战。引入时机需权衡业务发展和基础设施成本,初期推荐单块优先。中台战略通过复用核心服务提升效率。技术体系包含接入层、网关层、业务服务层等组件,涉及服务发现、配置中心等关键机制。通讯方式可选择REST或RPC,各有优缺点。整体而言,微服务架构需要综合考虑组织、技术和业务等多方面因素。
2025-10-17 14:07:05
686
1
原创 Kafka-2 Docker 部署单节点环境(SpringBoot验证)
本文介绍了Kafka的三种主要发行版(Apache Kafka、Confluent Kafka和Cloudera/Hortonworks Kafka)及其特点差异。重点讲解了使用Docker部署Kafka 3.6版本单节点环境的详细步骤,包括: 配置docker-compose.yml文件(含完整参数说明) 解决镜像下载问题的方法 通过容器内命令验证Kafka运行状态的常用方式 部署方案采用不需要Zookeeper的KRaft模式,适合测试环境搭建。
2025-10-15 14:18:11
818
原创 Kafka-1 初识消息引擎系统
Kafka 消息引擎系统概述 Kafka是一种高性能的消息引擎系统,采用发布/订阅模型,支持异步处理、流量控制和服务解耦。其核心架构包含主题(Topic)、分区(Partition)和副本(Replica)三层设计,通过领导者副本机制实现高可用性。Kafka使用二进制字节序列传输结构化消息,采用仅追加写入的日志文件存储方式,配合日志段机制实现高效数据管理。系统支持消费者组模式,具备自动重平衡能力,能够处理大规模分布式场景下的消息传递需求。
2025-10-14 17:17:11
688
原创 设计模式-命令模式
命令模式将请求封装为对象,使请求与执行解耦。文章通过公司部门处理客户需求的案例,演示了如何实现该模式:定义Command接口,创建具体请求类RequestA/B(封装部门执行逻辑),由Invoker类管理请求队列并统一执行。这种设计支持请求排队、撤销等功能,客户端只需提交请求而无需关注具体执行细节。代码展示了部门处理请求、调用者管理执行的完整流程,体现了命令模式的核心思想——将请求参数化并延迟执行。
2025-10-12 21:28:16
384
原创 设计模式-迭代器模式
本文介绍了迭代器设计模式的实现原理和应用场景。通过一个User类示例,展示了如何实现Iterable接口和内部迭代器类,使其支持增强for循环遍历。迭代器模式将遍历操作与容器类解耦,支持多种遍历方式(如树的前中后序遍历),并能安全处理并发修改。关键在于实现hasNext()和next()方法,并通过modCount机制防止遍历过程中的意外修改。该模式适用于需要灵活遍历复杂数据结构的场景,通过多态特性可方便切换不同迭代器,体现了面向对象的设计思想。
2025-10-12 19:30:43
985
原创 设计模式-访问者模式
访问者模式通过分离对象结构和操作来解耦代码。当对象接口方法不断增加导致实现类膨胀时,该模式将功能按维度拆分到不同访问者类(如Funcation1Visitor)中。被访问对象(AFuncationImpl等)通过实现Accept接口的accept方法,将自身传递给访问者执行对应操作。这种双分派机制既保持了多态优势,又实现了功能扩展时只需新增访问者类而无需修改现有类结构,符合开闭原则。典型应用场景包括复杂对象结构的多样化操作需求。
2025-10-12 14:38:06
420
原创 设计模式-解释器模式
解释器模式通过定义语法规则和解释器来处理特定语言表达式。本文以简单的数字运算为例,展示了如何实现一个解释器:首先定义Expression接口及实现类,然后通过栈结构解析后缀表达式,生成对应的语法树并计算结果。案例中,输入"1 3 4 2 - 2 3 6 * + * * + 30 -;被正确解析为((1+(3*((4-2)(2+(36)))))-30),验证了解释器模式的有效性。该模式通过拆分语法规则为独立单元,避免了复杂的整体解析逻辑,适用于需要自定义语法规则的场景。
2025-10-11 16:15:53
327
原创 设计模式-状态模式
状态模式是一种行为设计模式,用于管理对象状态转换,特别适用于复杂状态流转的场景。摘要对比了三种状态机实现方式:1)分支逻辑法通过枚举状态和条件判断实现,简单但难以维护;2)查表法使用二维数组存储状态转换规则,适合简单动作场景;3)状态模式通过多态解耦,将状态行为分散到不同类中,更易于扩展复杂逻辑。状态模式的核心是定义状态接口和上下文类,适合游戏、工作流等需要灵活状态管理的场景。每种方法各有优劣,应根据业务复杂度选择合适方案。
2025-10-11 14:39:59
558
原创 设计模式-责任链模式
责任链模式是一种将请求发送与接收解耦的设计模式,允许多个对象有机会处理请求。本文通过JPA注解校验案例,展示了如何实现该模式:定义Length、Max、Min等注解,创建对应的校验器类(LengthVerifier、MaxVerifier、MinVerifier),并通过Checker类组织校验流程。关键组件ValidatorContext负责维护校验状态和错误信息,实现链式校验逻辑。这种模式既支持遇到错误立即终止,也支持完整遍历所有校验器,具有灵活性和扩展性。
2025-10-10 14:12:09
721
原创 设计模式-策略模式
策略模式通过定义算法族并封装每个算法,使其可以互相替换。文章通过审核系统案例演示了策略模式的应用:定义策略接口和具体实现类(如注册资本和用房面积评分策略),并使用工厂模式优化策略选择。最终通过反射实现动态创建策略对象,解决了静态存储导致的复用问题。该模式的核心优势在于算法的灵活替换和独立演化,适用于需要动态选择算法的场景。
2025-10-10 09:33:08
317
原创 设计模式-备忘录模式
备忘录模式(Memento Pattern)是一种在不破坏封装性的前提下捕获对象状态并实现恢复的设计模式。其核心在于通过快照(Snapshot)备份对象状态,并使用栈结构存储历史记录以支持撤销操作。典型案例是实现文本输入的撤销功能,通过存储全量或增量备份来优化性能。该模式虽不常用,但在需要状态恢复的场景中具有价值,类似Redis的RDB和AOF备份机制。需注意高频备份可能带来的存储和性能问题,通常采用全量+增量备份结合的方式平衡效率与资源消耗。
2025-10-09 17:01:58
390
原创 设计模式-模板模式
模板方法模式是一种行为设计模式,它通过定义算法骨架并允许子类重写特定步骤来实现代码复用。文章以Java中的资源删除操作为例,展示了如何通过抽象类封装通用逻辑(如日志记录、删除验证),而将资源获取、保存等具体实现交由子类完成。这种模式在Java IO(如InputStream)和Servlet中都有应用,能够有效减少重复代码,提高代码复用性。通过继承机制,子类可以在不改变算法结构的情况下重新定义某些步骤,体现了好莱坞原则(不要调用我们,我们会调用你)的设计思想。
2025-10-09 14:17:04
496
原创 设计模式-中介模式
中介者模式(Mediator Design Pattern)通过定义一个中介对象来封装一组对象之间的交互,避免对象直接相互引用。该模式适用于多个对象需要相互协作但直接交互会导致复杂性的场景。以Java Swing图形界面为例,是否被表彰的单选按钮状态变化会影响其他组件的显示与隐藏,传统实现中对象间存在直接交互,而中介者模式将这些交互逻辑集中到中介对象中,增强了代码的可维护性和扩展性。中介者能统一协调各组件行为,有效降低系统耦合度。
2025-10-09 13:12:00
919
原创 设计模式-观察者模式
观察者模式(发布订阅模式)通过定义对象间的一对多依赖关系,实现状态变更时自动通知所有依赖对象。文中以系统间文件推送为例,展示了如何利用Spring事件机制实现解耦:推送C系统后触发事件,反馈A系统监听该事件异步处理。模式核心包含Subject(管理Observer注册/移除/通知)和Observer(定义更新逻辑)。实际应用中可根据需求选择同步/异步、进程内/跨进程(如消息队列)等实现方式,需注意观察者执行顺序控制。该模式适用于注册后发邮件等非强一致性场景,通常配合补偿任务保证可靠性。
2025-10-09 10:31:35
369
原创 设计模式-代理模式
本文介绍了代理设计模式的两种实现方式:静态代理和动态代理。静态代理通过继承或接口实现,在不修改原始类的情况下新增功能,但需要为每个类创建代理类。动态代理则通过Java反射机制在运行时动态生成代理类,更灵活高效。文中以统计方法执行耗时为例,分别演示了继承代理、接口代理和动态代理的实现代码,并指出Spring AOP和事务管理正是基于动态代理机制。最后解释了为什么private方法无法通过代理实现事务失效的原因。代理模式是扩展功能而不修改原始代码的典型解决方案。
2025-10-08 14:18:00
492
原创 设计模式-门面模式
门面模式是一种设计模式,为子系统提供统一的高层接口,使其更易用。通过封装多个小方法为一个大方法,既保持复用性又提升易用性。典型案例包括统一接口和SLF4J日志门面。该模式能减少系统间的交互次数,提升性能,同时支持插件化扩展。与SPI机制不同,门面模式侧重接口设计,而SPI侧重服务实现解耦。门面模式适用于提升接口易用性、解决性能问题和分布式事务等场景。
2025-10-06 00:00:33
523
原创 设计模式-适配器模式
适配器模式是一种结构型设计模式,可大可小,通过协议转换将不兼容的接口变得兼容。它有两种实现方式:类适配器(基于继承)和对象适配器(基于组合)。类适配器适合大部分方法兼容的情况,对象适配器则更灵活,适合接口差异大的场景。适配器模式常用于封装缺陷设计、统一接口、替代外部系统依赖以及兼容老版本接口等场景。实际应用中,如Tomcat连接器将HttpRequest转为ServletRequest,就是适配器模式的典型案例。
2025-10-05 15:23:38
690
原创 设计模式-装饰器模式
装饰器模式是一种通过组合而非继承来增强原有对象功能的设计模式。它强调对核心功能的补充,不同于代理模式的业务无关扩展。Java IO体系是典型应用,如BufferedInputStream通过内置缓冲区提升读取效率。该模式通过多层装饰实现功能叠加,避免了复杂的继承关系。其核心在于装饰器类与原始类实现相同接口,并持有原始对象引用,既增强特定功能又保留基础操作。相比继承,装饰器模式更灵活,支持多重功能组合,有效解决了类膨胀问题。
2025-10-04 23:08:38
410
原创 设计模式-桥接模式
桥接模式(Bridge Pattern)通过组合方式解耦抽象与实现,使两者能独立变化。典型案例是监控告警系统,其中告警级别(如紧急、一般)与通知方式(邮件、电话等)作为两个独立维度,通过桥接模式动态组合。抽象类Notification定义通知行为,接口MsgSender实现具体发送逻辑,两者通过组合关联,避免多层继承。该模式在JDBC、SLF4J等框架中广泛应用,体现了“抽象与实现分离”的设计思想。
2025-10-03 18:19:01
426
原创 设计模式-享元模式
享元模式是一种对象共享的设计模式,旨在通过复用相同或相似的对象来减少内存占用。其核心思想是将对象中可共享的部分(内部状态)与不可共享的部分(外部状态)分离,通过缓存共享内部状态来优化性能。典型案例包括文本编辑器中的字符格式处理,通过共享相同字体和大小的对象来降低内存消耗。与单例模式、线程池等复用技术不同,享元模式更专注于对象内存优化而非功能性复用。该模式适用于系统中存在大量重复对象且对象状态基本不变的场景,能有效提升资源利用率。
2025-09-26 15:29:35
536
原创 设计模式-组合模式
组合模式摘要 组合模式是一种处理树形结构数据的设计模式,通过统一接口实现对整体和部分的统一操作。文章以人口统计为例,展示了如何用组合模式计算省-市-区三级人口:定义PopulationNode 接口,由Province、City、District类分别实现,利用多态递归计算各级人口总和。该模式也适用于文件系统统计等场景,核心思想是将对象组合成树形结构,使客户端能一致处理单个对象和组合对象。组合模式体现了部分-整体的层次结构,兼具递归和统一处理的特点。
2025-09-26 10:54:12
968
原创 设计模式-原型模式
原型模式是一种创建型设计模式,通过复制已有对象来降低大成本对象的创建开销。本文通过一个文件MD5值统计案例,展示了如何利用后台定时任务更新内存中的HashMap,避免同步计算影响性能。针对访问期间数据一致性问题,提出版本化更新方案,采用浅拷贝结合局部更新的优化策略,类似Redis的写时复制技术,在保证数据一致性的同时提高效率。
2025-09-24 22:20:48
915
原创 设计模式-建造者模式
建造者模式通过分离对象构建与表示来解决复杂对象的创建问题。本文以线程池设计为例,展示了传统Setter方法导致的参数校验问题,提出使用建造者模式:通过Builder类逐步设置属性,最终在build()方法中完成校验并创建不可变对象。进一步扩展思路,借鉴Stream流思想,演示如何实现SQL生成器,利用多态接口限制方法调用顺序(如update后不能set)。该模式保证了对象创建过程的规范性和灵活性,特别适用于参数组合复杂且需严格校验的场景。
2025-09-24 14:26:03
365
原创 设计模式-工厂模式
本文介绍了工厂设计模式的两种实现方式。简单工厂模式通过一个集中式工厂类创建对象,可使用单例缓存优化性能;工厂方法模式则通过定义接口,由子类工厂实现具体对象创建,避免复杂的条件判断。文章以配置文件解析器为例,展示了两种模式的代码实现,并比较了它们的适用场景:简单工厂适合无状态对象,工厂方法更适合需要每次创建新实例的场景。
2025-09-22 16:10:21
988
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅