后端技术
文章平均质量分 94
源码级别的底层原理拆解。以面试追问为导向,回答“为什么这么设计“而非“怎么用“。
庞轩px
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
第二篇:RocketMQ事务消息——分布式事务的最终一致性方案
Producer的回查逻辑:根据消息中的业务参数(如商品ID、用户ID),查询本地事务的执行状态——比如检查Redis中的扣减流水标记是否存在、MySQL中的扣减流水记录状态是否为"已确认"。这样做的结果是——要么本地事务还没执行(半消息已发送但回滚),要么本地事务已执行(半消息已发送且提交)。RocketMQ的处理方式:Broker发现半消息超过一定时间(默认6秒)未被确认,主动向Producer发起回查请求——“你之前发给我的那条半消息,本地事务到底成功了没?半消息的本质是一条带"事务标记"的消息。原创 2026-05-14 00:00:02 · 469 阅读 · 0 评论 -
第一篇:RocketMQ架构与核心概念——一条消息从生产到消费的完整旅程
在秒杀系统专栏中,我多次提到"用RocketMQ做异步削峰"“用事务消息保证Redis扣库存和发消息的原子性”。但RocketMQ本身的工作原理,一直没有展开讲过。面试中,消息队列是分布式系统的核心考点:“RocketMQ的NameServer、Broker、Topic、Consumer Group分别做什么?“一条消息从生产到消费,经历了哪些步骤?“RocketMQ和Kafka、RabbitMQ有什么区别?为什么你的秒杀项目选RocketMQ?原创 2026-05-13 23:58:45 · 462 阅读 · 0 评论 -
第八篇:Spring与微服务——从SpringBoot到SpringCloud的演进
本文探讨了从单体架构到微服务的演进过程,分析了Nacos、Sentinel和Gateway三大微服务核心组件的作用。Nacos作为注册中心和配置中心,解决了服务发现和配置管理问题;Sentinel通过限流、熔断和降级机制保障系统稳定性;Gateway作为统一入口,提供路由和过滤功能。文章还对比了单体与微服务的优缺点,指出微服务适合中大型系统,但初期需权衡开发效率与运维复杂度。最后强调微服务架构需要根据业务需求渐进式演进。原创 2026-05-12 23:10:01 · 537 阅读 · 0 评论 -
第七篇:Spring扩展点——如何优雅地介入Bean的创建流程
本文深入解析Spring框架的四个核心扩展点:BeanFactoryPostProcessor、BeanPostProcessor、InitializingBean/@PostConstruct和Aware接口。这些扩展点允许开发者在Bean生命周期的不同阶段插入自定义逻辑。文章通过典型应用场景和代码示例,展示了如何利用这些扩展点实现属性覆盖、AOP代理、日志注入等功能,帮助开发者深入理解Spring的扩展机制。原创 2026-05-11 11:04:44 · 562 阅读 · 0 评论 -
第六篇:Spring用了哪些设计模式?——从单例到代理,拆解框架中的经典设计
本文从设计模式视角解析Spring框架的核心实现机制,重点剖析了单例模式、工厂模式、代理模式、模板方法模式等六大设计模式在Spring中的应用。单例模式通过容器管理保证Bean唯一性;BeanFactory作为IoC容器管理全局Bean生命周期,而FactoryBean封装单个复杂Bean的创建逻辑;AOP基于动态代理实现,区分JDK动态代理和CGLIB两种方式;JdbcTemplate采用模板方法模式封装JDBC固定流程。这些设计模式协同工作,共同构成了Spring框架的底层架构智慧原创 2026-05-11 11:02:03 · 540 阅读 · 0 评论 -
第五篇:Spring事务管理——@Transactional的底层实现与失效场景
摘要 Spring事务管理通过AOP动态代理实现,核心是TransactionInterceptor在代理对象中拦截@Transactional方法,自动管理事务开启、提交和回滚。事务传播行为定义了方法调用时的事务处理方式,REQUIRED会加入现有事务,REQUIRES_NEW会创建独立事务,NESTED则使用保存点实现嵌套事务。常见的事务失效场景包括:1)同类方法自调用绕过代理;2)非public方法无法被代理;3)异常被捕获未抛出;4)数据库引擎不支持事务(如MyISAM)。理解原理可避免事务失效问题原创 2026-05-10 23:45:45 · 379 阅读 · 0 评论 -
第四篇:SpringBoot自动配置——约定大于配置的底层原理
本文深入解析了SpringBoot自动配置的核心原理。传统Spring需要手动配置大量XML,而SpringBoot通过@SpringBootApplication注解实现自动配置,该注解由@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan三个核心注解组成。这种机制大幅简化了Spring应用的配置工作,开发者只需关注业务配置即可。原创 2026-05-10 23:33:56 · 435 阅读 · 0 评论 -
第三篇:SpringMVC——一个HTTP请求在Spring中经历了什么?
SpringMVC采用前端控制器模式,DispatcherServlet作为统一入口。核心流程包含请求接收、Handler映射、拦截器执行、参数解析、方法调用和结果处理。HandlerMapping建立URL到Controller方法的映射,HandlerAdapter解析参数注解(如@RequestParam)。拦截器在预处理和后处理阶段介入,消息转换器处理请求/响应数据格式转换。该架构通过组件协作实现请求到响应的完整处理链路,为开发调试提供理论基础。原创 2026-05-10 23:31:28 · 428 阅读 · 0 评论 -
第二篇:Spring AOP——动态代理与切面编程的底层原理
Spring AOP通过动态代理技术解决OOP难以处理的横切关注点问题(如日志、权限、事务)。它采用JDK动态代理(基于接口)或CGLIB(基于继承)在运行时生成代理对象,将横切逻辑与核心业务分离。核心概念包括:切面(Aspect)封装横切逻辑,切点(Pointcut)定义拦截规则,通知(Advice)指定增强时机,连接点(JoinPoint)表示可拦截点。Spring Boot 2.x默认使用CGLIB代理,通过切面注解实现事务管理、日志记录等通用功能,使业务代码更简洁。原创 2026-05-10 23:27:20 · 400 阅读 · 0 评论 -
第一篇:Spring IoC容器——控制反转的本质与Bean的生命周期
Spring IoC核心机制解析控制反转(IoC)将对象创建权交给容器,依赖注入(DI)实现解耦,推荐构造器注入方式。容器选择上,ApplicationContext比BeanFactory功能更全面,适合实际开发场景。Bean生命周期包含实例化、属性赋值、初始化、销毁四个阶段,每个阶段都提供扩展点。循环依赖通过三级缓存解决单例Bean问题,但构造器注入导致的循环依赖无法处理。原创 2026-05-10 23:23:54 · 441 阅读 · 0 评论 -
第七篇:Redis分布式锁——从setnx到RedLock的演进之路
本文系统梳理了Redis分布式锁的演进历程,从基础的setnx+expire到RedLock算法,分析了各阶段的解决方案及其局限性。主要内容包括:1)原子化加锁的必要性;2)锁释放时的value验证机制;3)Redisson的WatchDog自动续期原理;4)可重入锁的实现;5)Redis集群下主从切换导致的锁丢失问题;6)RedLock算法的实现与争议。文章揭示了分布式锁设计中的核心挑战——在保证互斥性的同时兼顾可用性,并指出不同方案的适用场景,为技术选型提供理论依据。原创 2026-05-09 23:57:55 · 371 阅读 · 0 评论 -
第六篇:Redis Cluster——分布式缓存的进阶方案
在上一篇文章中,我们拆解了主从复制和哨兵机制——它们解决了单机Redis的高可用问题。所有节点存的是同一份全量数据。如果数据量超过单机内存上限,哨兵也无能为力。这就是Redis Cluster要解决的问题——把数据分散到多台机器上,每台只存一部分数据,突破单机内存瓶颈。面试中,Cluster是Redis进阶的必考题:“Redis Cluster的数据分片原理是什么?“为什么是16384个哈希槽?“MOVED重定向和ASK重定向有什么区别?“Cluster有什么局限性?原创 2026-05-09 23:56:52 · 415 阅读 · 0 评论 -
第五篇:主从复制与哨兵机制——Redis高可用的基石
本文深入解析Redis高可用机制,重点剖析主从复制和哨兵系统的工作原理。主从复制通过全量/部分复制实现数据冗余,但存在异步延迟问题;哨兵机制通过主观/客观下线判断实现自动故障转移,采用Raft算法选举Leader执行主从切换。文章对比了哨兵与Cluster方案的适用场景,并以秒杀项目为例展示哨兵配置实践。全文从原理到应用,系统阐述了Redis如何通过主从复制+哨兵机制构建高可用架构,解决单点故障问题。原创 2026-05-09 23:56:05 · 443 阅读 · 0 评论 -
第四篇:RDB与AOF持久化——宕机后数据怎么恢复?
Redis通过RDB和AOF实现持久化:RDB生成内存快照,恢复快但可能丢数据;AOF记录写操作,数据安全但恢复慢。生产环境建议同时开启,采用混合持久化(Redis 4.0+),结合两者优势。RDB使用fork和COW技术,AOF提供三种刷盘策略(推荐everysec),并通过重写解决日志膨胀。配置需根据业务对数据丢失容忍度和恢复时间要求权衡。原创 2026-05-09 23:51:53 · 476 阅读 · 0 评论 -
第三篇:缓存穿透、击穿、雪崩——从原理到解决方案
缓存穿透查询不存在的数据导致请求直达数据库。解决方案包括布隆过滤器拦截非法请求,或缓存空对象设置短过期时间。缓存击穿热点Key突然失效引发大量并发查询。可通过互斥锁保证单线程重建缓存,或采用逻辑过期时间异步更新数据。缓存雪崩大量Key同时失效或Redis宕机。建议多级缓存架构、过期时间随机化分散压力,结合熔断降级机制保护数据库。秒杀场景需特别注意锁的实现细节和布隆过滤器误判率控制。原创 2026-05-09 19:55:38 · 206 阅读 · 0 评论 -
第二篇:Redis的过期删除与内存淘汰——数据过期了怎么删?内存满了怎么办?
疑问:操作系统中的LRU用链表实现,Redis为什么不用?回答:因为精确的LRU需要维护一个双向链表,每次访问都要把节点移到链表头部。Redis单线程架构下,频繁的链表操作会严重影响正常命令的吞吐。过期删除用惰性+定期组合:惰性解决CPU峰值,定期解决内存泄露。两者各退一步,内存和CPU达到平衡内存满了用淘汰策略:allkeys系列从所有Key中淘汰,volatile系列只淘汰有过期时间的KeyRedis的LRU是近似的。原创 2026-05-08 23:59:39 · 366 阅读 · 0 评论 -
第一篇:Redis数据结构底层——String、List、Hash、Set、ZSet各自用什么实现的?
你可能每天都在用Redis的String、List、Hash、Set、ZSet,但面试官追问到底层时,很多人就答不上来了:“Redis的String和Java的String是一回事吗?“List底层是链表还是数组?“ZSet怎么实现O(log n)排序的?“为什么Redis不直接复用C语言的原生数据结构?这些问题考察的不是"会用",而是"理解设计意图"。本文从底层实现的角度,逐个拆解Redis五大基本数据结构的内部原理。Redis的String底层是什么?SDS和C字符串有什么区别?原创 2026-05-08 23:59:09 · 584 阅读 · 0 评论 -
第八篇:MySQL架构与主从复制——高可用的基石
本文系统讲解了MySQL主从复制原理与高可用方案。首先剖析了MySQL三层逻辑架构(连接层、Server层、存储引擎层)的分工协作。重点阐述了主从复制的核心机制:通过Binlog实现数据同步,涉及Dump线程、I/O线程和SQL线程的协同工作。详细对比了Binlog的三种格式(STATEMENT、ROW、MIXED),推荐生产环境使用ROW格式以确保数据一致性。针对主从延迟问题,分析了其成因并提出并行复制、读写分离等解决方案。最后探讨了主从切换策略及常见高可用架构,为构建可靠的MySQL集群提供了系统性指导原创 2026-05-08 17:43:59 · 274 阅读 · 0 评论 -
第七篇:慢查询分析与SQL优化实战
本文系统介绍MySQL慢SQL优化全流程,涵盖发现、分析与优化策略。首先讲解如何通过慢查询日志和监控平台发现慢SQL,并解读关键指标。重点剖析Explain工具的输出含义,识别全表扫描、临时表等危险信号。通过订单分页查询案例,演示如何通过联合索引、覆盖索引消除性能瓶颈。针对深分页问题,提出子查询和游标分页优化方案。最后指出JOIN优化的核心在于驱动表选择和关联字段索引。全文提供从理论到实践的完整方法论,帮助开发者系统解决慢SQL问题,提升数据库性能。原创 2026-05-07 23:47:03 · 165 阅读 · 0 评论 -
第六篇:Redo Log与Binlog——崩溃恢复的底层保障
MySQL通过WAL机制以顺序写日志替代随机写磁盘,提升性能。Redo Log:InnoDB物理日志,记录数据页修改,确保崩溃恢复。Binlog:Server层逻辑日志,支持主从复制和数据恢复。UPDATE执行流程包含SQL解析、两阶段提交等步骤,确保数据一致性。关键参数如innodb_flush_log_at_trx_commit和sync_binlog可优化事务安全。两阶段提交机制是保障事务安全的核心。原创 2026-05-07 23:45:35 · 177 阅读 · 0 评论 -
第五篇:MySQL锁机制——从行锁到间隙锁
本文深入解析了InnoDB的锁机制,包括表锁、行锁和间隙锁的分类与实现原理。重点分析了行锁如何通过索引记录锁定数据,间隙锁如何防止幻读,以及临键锁作为RR隔离级别的默认锁机制。文章还详细探讨了死锁的产生原因、排查方法和预防策略,通过实例展示了如何通过SHOW ENGINE INNODB STATUS分析锁等待情况。最后总结了索引质量对锁范围的影响,为开发者优化数据库并发性能提供了实用指导。原创 2026-05-07 17:20:13 · 389 阅读 · 0 评论 -
第四篇:事务隔离级别与MVCC——InnoDB的并发控制
MySQL事务通过ACID特性确保数据一致性,解决并发问题。InnoDB默认使用RR隔离级别,依赖MVCC机制实现多版本控制。MVCC核心由Undo Log版本链和ReadView组成,通过隐藏字段(DB_TRX_ID、DB_ROLL_PTR)记录事务版本。RC和RR隔离级别的差异在于ReadView生成时机:RC每次查询生成新ReadView,RR在事务首次查询时生成。RR级别通过MVCC避免大部分幻读,部分场景需间隙锁配合。MVCC与锁机制协同实现高效并发控制。原创 2026-05-07 17:03:13 · 199 阅读 · 0 评论 -
第一篇:MySQL索引底层——B+树为什么是首选?
MySQL选用B+树索引因其综合性能优势:树高仅3层即可支持百万级数据,大幅减少磁盘IO(2-3次查询)。相比哈希表,B+树支持高效范围查询;对比B树,其非叶节点不存数据使单页容纳更多键值,提升空间利用率。聚簇索引直接存储行数据,二级索引通过主键值触发回表查询。叶子节点双向链表结构优化了顺序访问,16KB页大小设计平衡了存储效率与查询性能。原创 2026-05-06 15:21:48 · 206 阅读 · 0 评论 -
第二篇:联合索引与最左前缀原则——从Explain看索引命中
联合索引与最左前缀原则核心原理:联合索引(a,b,c)按a→b→c排序存储,仅当查询包含最左列(a)时才能利用索引有序性。跳过最左列将导致索引失效。关键结论:索引失效场景:跳过最左列、对索引列运算、隐式类型转换。索引下推(ICP)可减少回表次数(MySQL 5.6+)。Explain的type、key_len、Extra字段可验证索引使用情况。优化建议:高频查询条件作为联合索引最左列。范围查询后的列无法使用索引。排序字段加入索引避免filesort。优先使用覆盖索引减少回表。原创 2026-05-06 15:45:19 · 229 阅读 · 0 评论 -
第1篇:一段旅程的开始——JVM内存模型简介
本文介绍了Java虚拟机(JVM)的内存模型(运行时数据区),分为线程私有和共享区域。私有区域包括程序计数器、Java虚拟机栈和本地方法栈,随线程生灭;共享区域包含堆和方法区,是GC主战场。堆存储对象实例,方法区保存类信息、常量等。JDK8后方法区改用元空间,避免OOM。理解这些区域对性能调优和问题排查至关重要。文章还概述了执行引擎的作用,并总结了各区域特性及常见异常。原创 2026-03-02 11:55:29 · 806 阅读 · 0 评论 -
第2篇:对象的内存布局——从类型指针到OOP-Klass模型
本文深入解析了JVM中对象与类的关联机制。通过HotSpot的OOP-Klass模型揭示:对象头中的"类型指针"是物理存在的内存地址(_klass字段),直接指向方法区的Klass对象。Klass存储类元数据,包含方法表、字段信息等。通过HSDB工具可验证该指针的真实内存地址值。文章详细展示了方法调用的完整寻址过程,并解答了指针压缩等实现细节。最终阐明:类型指针本质是C++内存指针,通过直接地址跳转实现高效类访问,是JVM对象模型的底层基础。原创 2026-03-19 00:00:07 · 650 阅读 · 0 评论 -
第3篇:从一段代码看透JVM内存布局:对象、Klass、Method的底层真相
JVM内存布局探秘:从代码到内存的底层实现 本文通过分析User user = new User()这行简单代码,深入探索了JVM的内存布局机制。从编译期的字节码生成、常量池创建,到运行时的类加载过程,揭示了符号引用如何转换为直接引用。重点解析了Klass结构在方法区的存储方式、Method对象的设计原理,以及JVM如何通过独立Method对象支持动态修改等特性。文章展现了Java对象在JVM中的真实内存形态,帮助开发者理解从源代码到内存布局的完整转换过程。原创 2026-03-20 22:41:43 · 2613 阅读 · 0 评论 -
第4篇:类加载机制——从.class到Klass的完整旅程
Java类加载机制将.class文件转换为方法区中的Klass结构,分为五个阶段: 1. 加载 - 读取字节流并生成Class对象 2. 验证 - 检查字节码合法性 3. 准备 - 为静态变量分配内存并设默认值 4. 解析 - 将符号引用转为直接引用 5. 初始化 - 执行静态代码块和静态变量赋值 类加载器负责加载过程,采用双亲委派模型,确保类只被加载一次。类初始化在首次主动引用时触发,而被动引用(如访问静态常量)不会触发初始化。理解类加载机制对性能优化和故障排查至关重要。原创 2026-03-24 08:33:54 · 550 阅读 · 0 评论 -
第5篇:方法区的进化——永久代到元空间,为什么要变?
本文深入探讨了JVM方法区的实现演变,从JDK7的永久代到JDK8的元空间。作为JVM规范中的逻辑区域,方法区存储类元信息、常量、静态变量等数据。永久代作为早期实现位于堆内存,存在固定大小限制,而元空间改在本地内存中动态扩展,解决了OOM风险。文章详细对比了两者的内存布局、存储内容和GC机制差异,并分析了String.intern()方法在不同版本的行为变化。通过参数配置示例和性能优化建议,帮助开发者理解方法区变革的深层原因,为JVM调优提供实践指导。原创 2026-03-17 19:14:59 · 1134 阅读 · 0 评论 -
第6篇:GC Roots与可达性分析——对象是如何被标记存活的?
本文深入解析JVM可达性分析机制,揭示对象存活判定的核心原理。文章通过对象图模型和链表实例,详细演示了从GC Roots出发遍历引用链的过程,并列举了7类GC Roots:静态变量、常量引用、局部变量、活跃线程、方法参数、JNI引用和同步监视器。重点探讨了可达性分析法相比引用计数法的优势,特别是其能自动处理循环引用的特性。作为JVM系列第六篇,本文为后续垃圾回收机制和内存管理奠定了理论基础,帮助开发者深入理解Java内存管理的底层机制。原创 2026-03-17 19:09:31 · 819 阅读 · 0 评论 -
第7篇:引用类型——强、软、弱、虚,你还在用强引用吗?
本文深入解析Java四种引用类型:强引用、软引用、弱引用和虚引用。强引用确保对象永不回收(除非不可达);软引用在内存不足时回收,适合缓存;弱引用下次GC即回收,用于解决内存泄漏;虚引用无法获取对象,仅监控回收状态。通过对比引用强度、回收时机和使用场景(如ThreadLocal用弱引用、缓存用软引用),揭示不同引用类型的内存管理机制。文章还涉及直接内存回收原理,为理解JVM内存管理提供完整视角。原创 2026-03-21 09:59:10 · 863 阅读 · 0 评论 -
第8篇:Stop The World——GC为什么会让程序卡顿?
本文深入解析JVM垃圾回收中的Stop The World(STW)机制。STW是GC过程中暂停所有用户线程的关键操作,主要为了保证对象图一致性,避免并发标记时的引用关系变化导致对象误判。文章通过代码示例展示STW导致的程序卡顿现象,对比不同GC类型的STW时间差异(MinorGC几毫秒,FullGC可达秒级,ZGC<10ms)。同时分析了STW的必要性,以及现代GC(CMS/G1/ZGC)如何通过并发标记等优化减少STW时间,但某些关键阶段仍需短暂停顿。最后展望了ZGC等新一代回收器的低延迟特性。原创 2026-03-16 22:36:25 · 795 阅读 · 0 评论 -
第9篇:MinorGC完整流程与复制算法深度解析
本文深入解析JVM中的MinorGC机制,重点介绍了新生代内存布局和复制算法的运作原理。文章首先阐述了JVM堆内存的分代设计理念,指出新生代采用Eden区和两个Survivor区的8:1:1比例结构。通过对比标记-清除、标记-整理和复制三种GC算法,详细分析了复制算法在新生代场景下的优势——存活对象少、复制开销小、无内存碎片。最后完整描述了MinorGC的触发条件和执行流程,包括对象晋升老年代的机制。该系列文章系统性地讲解了JVM内存管理的核心概念,为理解Java性能优化提供了理论基础。原创 2026-03-16 22:38:10 · 593 阅读 · 0 评论 -
第10篇:动态年龄判定与空间分配担保——MinorGC背后的“潜规则”
本文深入解析了JVM MinorGC中的两个关键机制:动态年龄判定和空间分配担保。动态年龄判定允许对象在未达到15岁阈值时提前晋升老年代,当某年龄段对象总大小超过Survivor区一半容量时触发。空间分配担保则确保当To区空间不足时,老年代能提供备用空间,若担保失败将触发FullGC。通过源码分析和场景示例,文章揭示了这些潜规则如何维持GC的高效运行,并解答了关于对象晋升时机和GC容错能力的关键问题。原创 2026-03-23 01:13:49 · 688 阅读 · 0 评论 -
第11篇:FullGC深度解析——当老年代也撑不住的时候
本文深入解析JVM中的FullGC机制,将其与MinorGC进行对比,指出FullGC是对整个堆内存的完整回收,具有耗时长、影响大的特点。文章详细列举了FullGC的7种触发条件,包括显式调用System.gc()、老年代空间不足、元空间不足等。针对不同垃圾回收器(CMS、G1、Parallel Scavenge),分别剖析了FullGC的执行过程和退化机制,解释了为何某些情况下会退化为更耗时的单线程回收。最后强调FullGC是JVM性能调优的重点关注对象,理解其触发条件和执行机制有助于优化系统性能。原创 2026-03-23 01:20:00 · 1010 阅读 · 0 评论 -
第12篇:CMS与G1垃圾回收器深度剖析
本文深入剖析了JVM中两种经典垃圾回收器CMS和G1的设计原理。首先介绍了三色标记算法及其核心不变式,分析了漏标问题的本质和解决思路。CMS采用增量更新机制,通过四个阶段实现低停顿回收;G1则基于SATB快照和分区设计,实现可预测停顿。文章详细对比了两者的优缺点,并给出适用场景建议,帮助开发者根据应用特性选择合适的回收器。作为GC系列终篇,本文为理解JVM性能优化提供了关键视角。原创 2026-03-24 10:27:31 · 413 阅读 · 0 评论 -
第13篇:直接内存与零拷贝——NIO性能优化的底层真相
本文深入解析JVM直接内存与零拷贝技术,揭示高性能IO的底层原理。首先对比堆内存与本地内存的区别:堆内存由JVM管理,分配快但GC频繁;本地内存由OS管理,地址固定适合零拷贝。传统IO需要两次拷贝(硬盘→内核→堆内存),而NIO通过直接内存实现零拷贝,省去内核到用户空间的复制。直接内存通过ByteBuffer.allocateDirect()分配,虽不受GC直接控制,但可通过Cleaner机制回收。理解直接内存是掌握现代Java高性能编程的关键,尤其在Netty等框架中发挥核心作用。原创 2026-03-24 11:19:47 · 451 阅读 · 0 评论 -
第14篇:JVM参数调优实战——从GC日志到参数调整
本文是JVM参数调优实战指南,重点讲解如何通过GC日志分析优化JVM性能。首先介绍了开启GC日志的必要性和详细参数配置,包括JDK8及更高版本的日志格式设置。然后通过MinorGC和FullGC的日志实例,详细解读了各字段含义,帮助读者掌握日志分析方法。文章还解析了对象年龄分布日志和常见GC模式特征,为实际调优提供判断依据。最后给出了生产环境推荐的完整GC日志配置方案,为后续JVM调优实战奠定基础。原创 2026-03-24 17:32:05 · 391 阅读 · 0 评论 -
第15篇:OOM排查实战——从一个内存泄漏案例说起
在前面的文章中,我们学习了JVM内存布局、垃圾回收原理、以及参数调优方法。但即使配置再完美,代码层面的问题仍然可能导致内存泄漏,最终引发。内存泄漏是Java应用中最棘手的问题之一。它不像普通的Bug那样立即暴露,而是悄无声息地消耗内存,直到某一天系统突然崩溃。今天,我们就从一个真实的内存泄漏案例出发,从头到尾完整地走一遍OOM排查流程。什么是内存泄漏?和内存溢出有什么区别?如何导出和分析堆转储文件?MAT、VisualVM等工具如何使用?常见的内存泄漏场景有哪些?原创 2026-03-24 17:37:52 · 457 阅读 · 0 评论 -
第一篇:Java基础概念四连问,==与equals、hashCode约定、接口vs抽象类、深拷贝vs浅拷贝
本文深入解析Java面试中的三个基础核心概念: ==与equals()的区别:==比较内存地址,用于基本类型和引用类型;equals()默认比较地址,但可重写为内容比较,如String类。 hashCode()与equals()的约定:若equals()返回true,则hashCode()必须相同,否则会导致HashMap等集合工作异常。 接口与抽象类的区别:抽象类表示is-a关系,可包含构造方法和普通方法;接口表示can-do能力,支持多实现,Java 8后新增默认和静态方法。原创 2026-03-27 23:49:44 · 700 阅读 · 0 评论
分享