Forrest的笔记

记录工作积累 · 分享技术思考

关于本站

本网站用于展示个人工作中的积累与笔记,表达个人对工作与学习的思考方式。

作为一名拥有13年经验的技术从业者,我在这里记录和分享在软件开发、系统架构、问题排查等方面的实践经验和解决方案。

Java 核心技术

JVM 内存管理与调优

核心知识点

  • 堆内存分代模型:新生代(Eden、Survivor)、老年代、元空间
  • 垃圾回收算法:标记-清除、标记-整理、复制算法
  • 常用GC收集器:Serial、Parallel、CMS、G1、ZGC
  • JVM参数调优:-Xms、-Xmx、-XX:MetaspaceSize、-XX:MaxGCPauseMillis

常见问题与解决方案

问题:生产环境频繁Full GC导致应用卡顿

排查思路:

  • 使用jstat -gcutil查看GC频率和耗时
  • 通过jmap -heap查看堆内存使用情况
  • 使用MAT工具分析堆转储文件,定位内存泄漏对象

解决方案:调整堆内存大小,优化老年代比例,使用G1收集器替代CMS,修复代码中的内存泄漏问题(如未关闭的连接、缓存未设置过期时间)

并发编程

核心知识点

  • 线程池:ThreadPoolExecutor核心参数、拒绝策略、线程池大小计算
  • 锁机制:synchronized、ReentrantLock、读写锁、StampedLock
  • 并发工具类:CountDownLatch、CyclicBarrier、Semaphore、Exchanger
  • 并发集合:ConcurrentHashMap、CopyOnWriteArrayList、BlockingQueue

常见问题与解决方案

问题:高并发场景下出现死锁

排查思路:

  • 使用jstack命令导出线程堆栈信息
  • 查找"Found one Java-level deadlock"关键字
  • 分析锁的持有和等待关系

解决方案:统一锁的获取顺序,使用tryLock设置超时时间,避免嵌套锁,使用并发工具类替代手动加锁

集合框架深入理解

核心知识点

  • HashMap实现原理:数组+链表+红黑树、扩容机制、hash冲突解决
  • ConcurrentHashMap:分段锁(JDK7)vs CAS+synchronized(JDK8)
  • ArrayList vs LinkedList:随机访问vs插入删除性能对比
  • TreeMap vs HashMap:有序性vs性能权衡

常见问题与解决方案

问题:HashMap在多线程环境下出现死循环

原因分析:JDK7中HashMap扩容时采用头插法,多线程并发扩容可能形成环形链表

解决方案:使用ConcurrentHashMap替代HashMap,或使用Collections.synchronizedMap包装,避免在多线程环境下共享HashMap实例

Spring 生态体系

Spring Boot 核心机制

核心知识点

  • 自动配置原理:@EnableAutoConfiguration、spring.factories、条件注解
  • Starter机制:依赖管理、自动装配、配置属性绑定
  • 配置优先级:命令行参数 > 环境变量 > application.yml > 默认值
  • Actuator监控:健康检查、指标收集、端点暴露

常见问题与解决方案

问题:Spring Boot应用启动缓慢,耗时超过1分钟

排查思路:

  • 启动时添加-Ddebug参数查看自动配置报告
  • 检查是否扫描了过多的包路径
  • 排查是否有耗时的Bean初始化操作

解决方案:精确指定@ComponentScan范围,使用@Lazy延迟加载非必要Bean,排除不需要的自动配置类,优化数据库连接池初始化

Spring Cloud 微服务架构

核心知识点

  • 服务注册与发现:Nacos、Eureka、Consul的选型与配置
  • 负载均衡:Ribbon、LoadBalancer的负载策略
  • 服务调用:OpenFeign声明式调用、超时与重试配置
  • 熔断降级:Sentinel流量控制、熔断规则、降级策略
  • 配置中心:Nacos Config动态配置、配置刷新机制
  • 网关:Gateway路由、过滤器、限流熔断

常见问题与解决方案

问题:微服务调用链路超时,导致雪崩效应

排查思路:

  • 通过Sleuth+Zipkin追踪完整调用链路
  • 分析每个服务节点的响应时间
  • 检查是否存在慢SQL或外部接口调用

解决方案:配置合理的超时时间(Feign、Ribbon、Hystrix),启用Sentinel熔断降级,优化慢接口性能,使用异步调用解耦非关键链路

MyBatis 持久层框架

核心知识点

  • 动态SQL:if、choose、foreach、trim标签的使用
  • 缓存机制:一级缓存(SqlSession级别)、二级缓存(Mapper级别)
  • 结果映射:resultMap、association、collection的配置
  • 插件机制:Interceptor拦截器、分页插件PageHelper

常见问题与解决方案

问题:MyBatis一级缓存导致数据不一致

原因分析:同一个SqlSession中,相同查询会命中一级缓存,但其他事务的更新操作不会清空该缓存

解决方案:在Spring中配置SqlSession作用域为prototype,或在查询前调用clearCache(),关键业务使用@Transactional确保事务隔离

数据库技术

MySQL 性能优化

核心知识点

  • 索引优化:B+树结构、聚簇索引、覆盖索引、最左前缀原则
  • 执行计划分析:EXPLAIN关键字段(type、key、rows、Extra)
  • 事务隔离级别:读未提交、读已提交、可重复读、串行化
  • 锁机制:表锁、行锁、间隙锁、Next-Key Lock
  • 主从复制:binlog、relay log、主从延迟问题

常见问题与解决方案

问题:慢查询导致数据库CPU飙升

排查思路:

  • 开启慢查询日志,设置long_query_time阈值
  • 使用EXPLAIN分析慢SQL的执行计划
  • 检查是否走索引、是否全表扫描、是否使用临时表

解决方案:为WHERE、ORDER BY、JOIN字段添加合适索引,避免SELECT *,优化子查询为JOIN,分页查询使用延迟关联,大表查询添加分区

问题:高并发下出现死锁

排查思路:执行SHOW ENGINE INNODB STATUS查看死锁日志

解决方案:统一事务中锁的获取顺序,缩小事务范围,降低事务隔离级别(如改为RC),使用乐观锁替代悲观锁

Oracle 数据库管理

核心知识点

  • 体系结构:实例(SGA、PGA)、数据库(数据文件、控制文件、日志文件)
  • 表空间管理:创建、扩容、迁移、碎片整理
  • 备份恢复:RMAN备份策略、闪回技术、数据泵导入导出
  • 性能调优:AWR报告分析、SQL调优、执行计划优化

常见问题与解决方案

问题:表空间不足导致应用无法写入

应急处理:ALTER TABLESPACE增加数据文件或扩展现有文件大小

长期方案:设置数据文件自动扩展,定期清理历史数据,归档日志及时备份删除,监控表空间使用率并设置告警

Redis 缓存实战

核心知识点

  • 数据结构:String、Hash、List、Set、ZSet及应用场景
  • 持久化机制:RDB快照、AOF日志、混合持久化
  • 过期策略:定期删除+惰性删除、内存淘汰策略(LRU、LFU)
  • 高可用方案:主从复制、哨兵模式、集群模式

常见问题与解决方案

问题:缓存穿透、击穿、雪崩

缓存穿透:查询不存在的数据,缓存和数据库都没有。解决方案:布隆过滤器、缓存空值

缓存击穿:热点key过期瞬间大量请求打到数据库。解决方案:热点数据永不过期、互斥锁、逻辑过期

缓存雪崩:大量key同时过期。解决方案:过期时间加随机值、多级缓存、限流降级

问题:Redis内存占用过高

排查思路:使用MEMORY USAGE查看key占用,INFO memory查看整体内存

解决方案:设置合理的过期时间,使用Hash结构压缩小对象,开启key淘汰策略,定期清理无用数据,考虑数据分片

中间件技术

消息队列 - RocketMQ

核心知识点

  • 消息模型:普通消息、顺序消息、事务消息、延迟消息
  • 架构组件:NameServer、Broker、Producer、Consumer
  • 消费模式:集群消费、广播消费、推拉模式
  • 消息可靠性:同步发送、异步发送、重试机制、死信队列

常见问题与解决方案

问题:消息堆积导致消费延迟

排查思路:通过控制台查看消费组堆积量、消费TPS、消费延迟时间

解决方案:增加消费者实例数量,优化消费逻辑减少处理时间,批量消费提高吞吐量,临时扩容Topic队列数,考虑消息过滤减少无效消费

问题:消息重复消费

原因分析:网络抖动、消费者宕机、消费超时等导致消息重新投递

解决方案:业务层实现幂等性(唯一键、状态机、分布式锁),使用数据库唯一索引防重,Redis记录已处理消息ID

ZooKeeper 分布式协调

核心知识点

  • 数据模型:ZNode节点类型(持久、临时、顺序)
  • Watcher机制:一次性触发、事件通知
  • ZAB协议:Leader选举、数据同步、崩溃恢复
  • 应用场景:配置管理、命名服务、分布式锁、集群管理

常见问题与解决方案

问题:ZooKeeper集群脑裂

原因分析:网络分区导致集群分裂成多个子集群

解决方案:确保集群节点数为奇数(2N+1),配置合理的心跳超时时间,使用独立的网络环境,监控网络质量

Netty 网络编程

核心知识点

  • Reactor模型:主从Reactor多线程模型
  • 核心组件:Channel、EventLoop、ChannelPipeline、ChannelHandler
  • 编解码器:ByteToMessageDecoder、MessageToByteEncoder
  • 零拷贝:DirectBuffer、FileChannel.transferTo

常见问题与解决方案

问题:TCP粘包拆包问题

解决方案:使用固定长度解码器FixedLengthFrameDecoder,分隔符解码器DelimiterBasedFrameDecoder,长度字段解码器LengthFieldBasedFrameDecoder,自定义协议添加消息头

DevOps 与运维

Kubernetes 容器编排

核心知识点

  • 核心对象:Pod、Deployment、Service、Ingress、ConfigMap、Secret
  • 调度机制:资源请求与限制、亲和性与反亲和性、污点与容忍
  • 服务发现:ClusterIP、NodePort、LoadBalancer、Headless Service
  • 存储管理:PV、PVC、StorageClass、动态供给
  • 健康检查:LivenessProbe、ReadinessProbe、StartupProbe

常见问题与解决方案

问题:Pod一直处于Pending状态

排查思路:

  • kubectl describe pod查看Events事件
  • 检查节点资源是否充足(CPU、内存)
  • 查看是否有污点导致无法调度
  • 确认镜像拉取是否成功

解决方案:调整资源请求量,添加节点或清理资源,配置容忍度,使用私有镜像仓库并配置imagePullSecrets

问题:服务间调用超时或失败

排查思路:检查Service配置、网络策略、DNS解析、端口映射

解决方案:确认Service selector与Pod labels匹配,检查targetPort配置,验证网络插件工作正常,使用服务网格(Istio)增强可观测性

Jenkins CI/CD

核心知识点

  • Pipeline语法:声明式Pipeline、脚本式Pipeline
  • 构建触发:Git Webhook、定时构建、参数化构建
  • 插件生态:Git、Maven、Docker、Kubernetes、SonarQube
  • 分布式构建:Master-Slave架构、动态Agent

常见问题与解决方案

问题:构建过程中内存溢出

解决方案:调整Jenkins JVM参数(-Xmx),为Maven构建配置MAVEN_OPTS,使用增量编译,清理workspace历史构建产物

GitLab 代码管理

核心知识点

  • 分支策略:Git Flow、GitHub Flow、GitLab Flow
  • CI/CD集成:.gitlab-ci.yml配置、Runner注册与管理
  • 代码审查:Merge Request、Code Review流程
  • 权限管理:项目角色、分支保护、标签保护

常见问题与解决方案

问题:GitLab Runner构建队列堆积

解决方案:增加Runner数量,使用标签分配不同类型任务,配置并发数concurrent,优化Pipeline减少不必要的Job

Nginx 反向代理与负载均衡

核心知识点

  • 负载均衡算法:轮询、加权轮询、IP Hash、least_conn
  • 反向代理配置:proxy_pass、upstream、健康检查
  • 性能优化:gzip压缩、静态资源缓存、连接池
  • 安全配置:SSL/TLS、限流、防盗链

常见问题与解决方案

问题:502 Bad Gateway错误

排查思路:检查后端服务是否正常、upstream配置是否正确、超时时间设置

解决方案:确认后端服务启动,调整proxy_connect_timeout和proxy_read_timeout,检查防火墙规则,查看error.log定位具体原因

Linux 系统运维

核心知识点

  • 性能分析:top、htop、vmstat、iostat、sar
  • 网络诊断:netstat、ss、tcpdump、ping、traceroute
  • 日志管理:journalctl、logrotate、rsyslog
  • Shell脚本:自动化部署、定时任务、监控告警

常见问题与解决方案

问题:服务器负载高,响应缓慢

排查思路:

  • top查看CPU、内存使用情况,找出占用高的进程
  • iostat查看磁盘IO是否成为瓶颈
  • free -h查看内存使用和swap情况
  • netstat -an查看网络连接数

解决方案:优化应用程序性能,增加服务器资源,使用缓存减少数据库压力,配置连接池限制并发,启用负载均衡分散流量