主要面试点:Java MySQL docker(按遇到频率) 除八股外技术(flyway,xljob)
知识点目录
- 一.主要知识点
- Java
- Java中==与equals()的区别。
- 如何创建线程池?线程池常见参数有哪些?
- 线程生命周期
- ThreadLocal 的用法和实现原理。
- JVM 运行时数据区
- 一、线程私有
- 二、线程共享
- 三、补充:直接内存(堆外内存)
- 说说JVM的垃圾回收算法。
- 设计模式
- spring
- ioc
- aop
- bean的生命周期
- redis
- redis为什么这么快
- redis常用数据类型及对应使用
- redis持久化策略
- 双写一致性
- MySQL
- MySQL调优
- 网络
- TCP 与 UDP 的 10 大核心区别是什么?
- 三次握手
- Linux
- 常用指令
- docker
- 和虚拟机区别
- 二.前端
- vue
- nginx
- 反向代理
- 项目相关,请查看项目相关文章
一.主要知识点
Java
Java中==与equals()的区别。
基本数据类型时,比较两个数值是否相等;比较引用类型,比较的是对象的内存地址是否相等。 equals() 没有重写时,Object默认以==来实现,重写以后,按照对象的内容进行比较
如何创建线程池?线程池常见参数有哪些?
ThreadPoolExecutor构造函数或Executors工具类
核心参数包括:核心线程数、最大线程数、存活时间、任务队列、拒绝策略。
// 核心参数:核心线程数、最大线程数、空闲存活时间、时间单位、阻塞队列ThreadPoolExecutorpool=newThreadPoolExecutor(2,// corePoolSize 核心线程4,// maximumPoolSize 最大线程2L,// 空闲线程存活时间TimeUnit.SECONDS,newArrayBlockingQueue<>(5),// 阻塞队列Executors.defaultThreadFactory(),newThreadPoolExecutor.AbortPolicy()// 拒绝策略:抛异常);// 创建固定3个线程的线程池ExecutorServicepool=Executors.newFixedThreadPool(3);线程池有线程前置勾子后置勾子,可以用来传递上下文认证信息
线程生命周期
NEW
↓ start()
RUNNABLE
├─ 拿不到synchronized锁 → BLOCKED(拿到锁回到RUNNABLE)
├─ wait() / join() / park() → WAITING(被唤醒回到RUNNABLE)
└─ sleep(ms)/wait(超时) → TIMED_WAITING(超时/唤醒回到RUNNABLE)
↓ 任务跑完 / 异常
TERMINATED
ThreadLocal 的用法和实现原理。
ThreadLocal用于存储线程私有数据
每个Thread内部维护ThreadLocalMap
使用后及时remove()防止内存泄漏,弱引用键设计可辅助垃圾回收(key 是弱引用,value 是强引用)。
JVM 运行时数据区
一、线程私有
- 程序计数器:记录字节码执行地址,native 方法为空;唯一不会 OOM。
- 虚拟机栈:存放栈帧(局部变量表、操作数栈等);方法调用进出栈;可抛 StackOverflowError / OOM。
- 本地方法栈:服务 native 本地方法,结构同虚拟机栈。
二、线程共享
- 堆:存放对象实例、数组,GC 主要区域;分新生代、老年代;OOM:Java heap space。
- 方法区(元空间 Metaspace):存类元信息、运行时常量池;不在 JVM 堆,默认受机器物理内存限制;大量动态生成类会报 Metaspace OOM。
三、补充:直接内存(堆外内存)
说说JVM的垃圾回收算法。
标记-清除(老年代,产生内存碎片)、复制算法(适合新生代)、标记-整理(适合老年代)
设计模式
- SRP 单一职责:一个类只有一个引起它变化的原因
- OCP 开闭原则:对扩展开放,对修改关闭(核心目标)
- LSP 里氏替换:子类可以替换父类,不破坏原有逻辑
- ISP 接口隔离:用多个小接口,不要大而全的臃肿接口
- DIP 依赖倒置:高层、低层都依赖抽象,不依赖具体细节(就是前面 IoC 用到的)
- 狸花猫类记忆
- LoD 迪米特法则(最少知识):对象尽量少了解其他对象内部,只和朋友通信
spring
ioc
IoC(控制反转)是一种设计原则,对象创建和依赖管理的控制权从程序转移至外部容器,降低代码耦合。核心思想是“依赖由外部注入而非主动创建”,常见实现方式为依赖注入(DI)。通过容器统一管理对象生命周期,提升代码灵活性和可维护性,使组件更易测试和扩展。
aop
AOP(面向切面编程)通过横向抽取共性功能(如日志、事务),解决代码重复和耦合问题。以动态代理机制在目标方法前后织入增强逻辑,核心概念包括切点(where)、通知(what)、切面(where+what)。实现了业务逻辑与横切关注点分离,提升代码复用性和可维护性。
bean的生命周期
实例化 → 属性填充 → 初始化 → 使用 → 销毁
redis
redis为什么这么快
Redis 是单线程模型 + 纯内存操作 + 高效 IO 多路复用 + 精简数据结构,再加上合理的网络协议,所以速度极高。
网络协议:Redis 通信协议简单,解析开销很小,不需要复杂的序列化 / 反序列化。
redis常用数据类型及对应使用
- string:主要:缓存、计数器、验证码、分布式锁
- hash:主要:存储对象,用户信息、购物车
- list:主要:简易消息队列、最新评论、消息时间线
- set:主要:点赞收藏、共同好友、黑白名单
- zset:主要:排行榜、热搜、延时队列
redis持久化策略
RDB(二进制快照) 恢复速度快:二进制文件紧凑,加载速度远快于 AOF。
AOF(追加日志)
数据安全性高:最多丢失 1 秒数据(everysec模式)。
可读性强:AOF 文件为文本格式,便于人工分析或修复。混合持久化(RDB + AOF)
| 场景 | 推荐方案 | 理由 |
|---|---|---|
| 允许分钟级数据丢失 | RDB | RDB恢复速度快,适合备份和快速重启;快照方式,故障丢失上一次快照后的数据 |
| 不允许数据丢失 | AOF | 最多丢失1秒数据,安全性高,每秒刷盘记录写命令 |
| 高吞吐量场景 | RDB 或 混合持久化 | 减少AOF频繁同步带来的磁盘IO开销,提升吞吐量 |
| 数据恢复优先级 | 混合持久化 | 兼顾RDB快速恢复 和 AOF的数据完整性 |
双写一致性
常用方法包括:先更新数据库再删缓存(Cache-Aside)、延迟双删(更新前后均删缓存并延迟二次删除)、基于消息队列异步同步、监听数据库binlog触发缓存更新,以及设置缓存过期时间兜底。
MySQL
MySQL调优
一、语句及索引(动态查询方向)
- 避免索引失效:不要在索引列做函数运算、隐式转换、like
%前缀模糊、or 连接非索引字段 - 避免大查询:禁用
select *;分页大偏移用主键过滤;杜绝order by/group by无索引导致文件排序 - 减少事务内操作,缩小事务时长,降低锁等待
- 合理建索引:联合索引遵循最左前缀原则;区分度低字段不建索引;避免过多索引(影响写入)
- 优化 join:小表驱动大表,join 字段必须建索引;减少 join 表数量
- 减少事务内操作,缩小事务时长,降低锁等待
三、表结构优化(静态查询方面)
7. 字段类型尽量小:能用 int 不用 bigint;varchar 够用即可;日期推荐 datetime,少用 text/blob 大字段
8. 适当分表:水平分表(按时间 / 用户 id 拆分)、垂直分表(大字段拆到副表)
9. 引擎选择:业务绝大部分用 InnoDB,支持事务、行锁;MyISAM 不支持事务,少用
五、锁与事务优化(业务方面)
- InnoDB 行锁基于索引,不走索引会退化为表锁
- 降低隔离级别:默认 RR,读多业务可考虑 RC,减少幻读锁开销
- 避免长事务,长事务占用 undo、锁资源,容易产生死锁
网络
TCP 与 UDP 的 10 大核心区别是什么?
| 维度 | TCP | UDP |
|---|---|---|
| 是否连接 | 面向连接:三次握手建立、四次挥手释放 | 无连接:直接发报文 |
| 可靠性 | 序列号 + ACK + 重传 → 可靠、有序、不丢不重 | Best-Effort:可能丢、乱序、重复,不保证送达 |
| 传输粒度 | 字节流(Stream) 应用看不到分段 | 报文(Datagram) 一次send()= 一次完整包 |
| 流量 / 拥塞控制 | 有窗口 + 拥塞算法(慢启动、拥塞避免、BBR…) | 无流控、无拥塞控制,发得快丢得多 |
| 首部开销 | 20 Byte 起,带选项可到 40-60 Byte | 8 Byte 固定,结构简单 |
| 传输速度 | 稳定但握手 + 拥塞控制 → 首包慢、稳中求胜 | 低延迟、抖动小,但需应用自行容错 |
| 组播 / 广播 | 不支持 | 原生支持单播 / 组播 / 广播 |
| 适用场景 | HTTP/HTTPS、FTP、数据库、电子邮件… | DNS、VoIP、直播、在线游戏、DHCP… |
| 稳定性成本 | 端口占用多、FD 常驻、握手耗 RTT | 资源占用低、无状态,服务端易做并发 |
| 消息边界 | 无,需要应用层自行划分 | 天然保留边界,一包一消息 |
三次握手
第一次握手:客户端向服务器端发送SYN,确认客户端的发送没问题。
第二次握手:服务器向客户端发送SYN和ACK包,确认服务器的发送与接收没问题
第三次握手:客户端最后回复一个ACK包,确认客户端的接收没问题。
Linux
常用指令
- ls 主要:列出目录文件
- cd 主要:切换目录
- pwd 主要:查看当前所在路径
- mkdir 主要:创建目录,-p 可创建多级目录
- rm 主要:删除文件或目录,rm -rf 强制删除
- cp 主要:复制文件、文件夹
- mv 主要:移动文件,也可用于重命名
- cat 主要:查看文件全部内容
- less 主要:分页查看大文件
- tail 主要:查看文件末尾,tail -f 实时跟踪日志
- grep 主要:过滤检索文本内容
- ps 主要:查看进程信息
- top 主要:实时监控 cpu、内存和进程
- kill 主要:终止进程;linux 命令行无法单独删除单个线程,只能 kill 整个进程
- ss 主要:查看端口连接信息,替代 netstat
- df 主要:查看磁盘分区使用率
- du 主要:查看文件夹占用磁盘大小
- tar 主要:文件压缩和解压
docker
和虚拟机区别
Docker 容器共享宿主机内核,轻量、启动快、资源占用低,但隔离性弱;虚拟机有独立完整操作系统,隔离安全,但体积大、启动慢、资源消耗高。
二.前端
vue
- Vue2 与 Vue3 核心区别 主要:Vue2 选项式 API,Object.defineProperty 实现响应式;Vue3 组合式 API,Proxy 实现响应式,支持 TS,打包体积更小、性能更好。
- 响应式原理 主要:Vue2 用 Object.defineProperty 劫持属性,无法监听新增 / 删除属性、数组下标;Vue3 用 Proxy 代理整个对象,可监听新增、删除、数组索引。
- 生命周期 主要:Vue2 选项式生命周期;Vue3 选项式保留,组合式用 onMounted/onUpdated 等钩子,在 setup 内部使用。
- 状态管理 Pinia 主要:Vue3 推荐,移除 mutation,可直接修改 state;天然支持 TS,无嵌套模块,更简洁。
- 组件通信 主要:父传子 props,子传父 $emit;跨层级 provide/inject;全局状态 Vuex/Pinia;兄弟组件可用事件总线。
- 编译优化 主要:Vue2 编译生成渲染函数;Vue3 编译时标记静态节点、提升静态常量,减少虚拟 DOM 创建开销。
nginx
反向代理
Nginx 反向代理 主要:接收客户端请求,转发请求到后端服务,再把后端结果返回给客户端;隐藏后端真实地址、做请求转发。