1. JVM内存结构
2. GC算法
3. 对象创建过程
4. OOM问题排查
5. IOC
6. AOP
7. 自动装配
8. 优化SQL
9. 表结构设计
10. 分库分表
11. 主从同步
12. 持久化
13. 淘汰机制
14. kafka负载均衡
15. kafka消息可靠性保证
16. leader选举
17. 分区分配策略
18. 三握四挥
- 概念:三次握手和四次挥手是TCP协议中用来建立和终止TCP连接的过程。
- 三次握手:是建立一个TCP连接的过程,需要三个步骤:
- 客户端发送连接请求报文段,
- 服务器收到请求并发送确认报文段,
- 客户端收到确认并发送确认报文段。
- 四次挥手是终止一个TCP连接的过程,需要四个步骤:
- 客户端发送终止请求报文段,
- 服务器收到请求并发送确认报文段,
- 客户端收到确认并发送确认报文段,
- 服务器收到确认并终止连接。
19. 滑动窗口
- 概念:滑动窗口协议(Sliding Window Protocol),属于TCP协议的一种应用,用于网络数据传输时的流量控制,以避免拥塞的发生。该协议允许发送方在停止并等待确认前发送多个数据分组。由于发送方不必每发一个分组就停下来等待确认。因此该协议可以加速数据的传输,提高网络吞吐量。
20. 粘包
- 什么是TCP粘包问题:
- TCP粘包就是指发送方发送的若干包数据到达接收方时粘成了一包,从接收缓冲区来看,后一包数据的头紧接着前一包数据的尾,出现粘包的原因是多方面的,可能是来自发送方,也可能是来自接收方。
21. 项目
21.1 自我介绍
21.2 仓库管理系统
背景:
- 首先我本科的时候在学校的慈善助学超市当过志愿者,这个超市是由省慈善总会拨款资助的,里面的工作人员都是学生担任。
- 我在里面当志愿者的时候发现他们记录购买和分发的生活用品都是使用纸质的本子记录,效率很低,同时容易出现数量对不上的问题。所以我就和同学组队一起做了一个仓库管理系统,希望能够提高助学超市的商品的管理效率。
项目开发:
- 在这个项目里,我们使用maven来进行依赖控制,使用git进行版本控制,用jira来管理任务和bug。
- 我使用junit编写单元测试,根据真实的业务数据来编写案例,而且在编写代码时,我会非常注意编码规范,比如定义变量时会让人一看就理解 ,在关键代码地方多写注释,在if等条件里不会写太复杂,一个方法不会写太长。而且,一旦遇到我的bug,我会第一时间跟进,并会和相关对应的人一起解决掉。
技术:
- 我们这个项目用到了SpringBoot框架,
- 其中用DataSource连接MySQL数据库,
- 在控制层里用到了@RequestMapping注解来编写业务处理方法。
- 在业务代码里,使用@Autowired注解来以IOC的方式引入类,还用到了@Service和@Component注解。
- 当我们从数据库里拿到数据后,会用包含@Entity和@Table注解的模型类来映射数据。
- 在这个项目里,我们还用到了@Transactional注解来定义事务,这个注解是作用在Service层上的,
- 在这个项目里,我们还用到多个Java集合类和异常处理类。
应背八股文:
- 1 @Service和@Component注解的差别?
- 2 各种Restful请求格式以及各种http请求返回码。
- 3 @Transactional事务里的事务隔离级别和事务传播机制概念。
- 4 Spring依赖注入概念和@Autowired的用法。
- 5 Spring Bean的生命周期。
- 6 甚至可能还会问Spring Boot启动流程以及底层源码。
内存调优:
- 在本项目里,我会非常注意内存的使用性能,并在项目里有过排查分析OOM的项目经验,我在编码的时候,也会非常注意内存性能,同时我也了解过JVM内存结构以及GC算法。
- OOM:
- 先获取内存的 Dump 文件,配置 JVM 启动参数,当触发了 OOM 异常的时候自动生成,
- 然后使用 MAT 工具来分析 Dump 文件。
- 内存性能:
- 在写代码时,我会非常注意,在try…catch…finally里关闭Connection和大的集合,
- 一些大的对象用好以后,我会及时把它们设置成null,以此提升它们的回收时间,
- 在for等循环里,我不会频繁地操作String对象,因为会产生大量内存碎片。
- 同时,我会非常谨慎地使用finalize方法(事先看下),因为这可能会导致对象无法回收。
- 在数据同步的业务场景里,我用到了弱引用(或软引用),以此提升数据对象的回收时间。
应背八股文:
- JVM内存结构
- GC(垃圾回收)流程
数据库调优
- 1 索引的数据结构(比如B+树),建索引的语句,索引的种类,尤其是复合索引以及对应的回表和最左匹配原则。
- 2 索引的正确用法,以及哪些情况下用不到索引,比如where a != ‘xx’可能就用不到。
- 3 索引的代价(会占硬盘,以及大批量读写时会重建索引,所以性能慢),以及在小表里,无需建索引。
- 4 执行计划的概念,以及通过执行计划排查慢sql时该注意的点(避免全表扫描,设置合理的关联表方式等)。
- 5 三范式和反范式相关概念,因为你提到了。
- 6 事务隔离级别里的脏读等概念,以及事务传播机制,尤其地,你要具体说出你项目里用的是哪个。