【面经分享,附答案】字节系统架构,一面,后端开发
本文收录于 www.cswiki.top
以后发面经我都会尽量带上我的答案(蓝色引用框中的就是),不过不会写得那么详细,大概就是写一下如果我答的话具体逻辑是怎么样的,关键词啥的。有些我觉得不是很常见或者暂时不知道咋回答的题目,会加粗显示出来,也欢迎小伙伴们和我交流
今日面经来源:https://www.nowcoder.com/discuss/985106
一面
总结:完全没有问项目问题,计算机网络部分问的特别细!死问我数据链路层的传输原理,答得磕磕绊绊,有好些题都没有答得很好,算法题倒是挺简单的,最后反问,面试官说我答得挺好的,但有些地方细节上还需要再学习优化下。
1)HTTP 三次握手,状态码,交互细节
HTTP 三次握手就是 TCP 三次握手,HTTP 是应用层协议,它的任务是与服务器交换信息。至于怎么连到服务器,怎么保证数据正确,HTTP 不管。事实上它总是假设数据是正确地传输的。
而 TCP 的任务是保证连接的可靠,包括防丢、防错。为了做到这些,在初次连接时要进行3次握手,以保证确实连接到了目标机器。而连接上后具体传送什么数据,TCP 是不管的
状态码:1xx 信息类提示,2xx 请求成功,3xx 请求重定向,4xx 服务器异常,5xx 客户端异常
交互细节应该就是 TCP 三次握手
2)为什么要三次握手
3)四次挥手,状态码,传输细节,为什么握手要三次,挥手要四次
4)数据链路层怎么传输数据的,展开说说
5)ARP 协议中网关怎么去转换 IP 地址到对应 MAC 地址的
关键点:ARP 高速缓存、广播 ARP 请求报文、ARP 响应报文
6)如果数据包不在当前子网内,怎么传输到目标子网网关的
首先,如何判断这个数据包的目标 IP 地址和当前主机的 IP 地址是否在同一子网(网段)内?利用子网掩码可以判断两台主机是否中同一子网中。若两台主机的 IP 地址分别与它们的子网掩码相 “与” 后的结果相同,则说明这两台主机在同一子网中。
其次,网关到底是什么呢?网关实质上是一个网络通向其他网络的 IP 地址(一般都是路由器的 IP 地址)。而默认网关(Default Gateway)就是一台主机如果找不到可用的网关,就把数据包发给默认指定的网关,由这个网关来处理数据包
当一台计算机发送数据时,根据数据包中的目标 IP 地址,通过子网掩码来判定目标主机是否在本地子网中,如果目标主机在本地子网中,则(通过二层设备 - 交换机)直接发送即可。如果目标不在本地子网中则将该信息送到缺省网关/路由器,由路由器将其转发到其他网络中,进一步寻找目标主机。
7)MySQL 的行锁怎么实现的
InnoDB 行锁是通过给索引上的索引项加锁来实现的
8)MySQL 的事务,展开说说
先解释下 ACID 特性,然后说下 MySQL 如何保证 ACID 的:锁来保证隔离性(可扩展四种并发问题、四种隔离级别、行锁的三种算法、着重提一下 Next-Key Lock 解决幻读问题 ),redo log 保证持久性和原子性(持久性对应 WAL 和 CheckPoint,原子性对应 redo log 两阶段提交),undo log(MVCC)保证一致性
9)MySQL 索引了解吗,索引是怎么实现的
10)索引有哪些,介绍下
聚簇索引、非聚簇索引、唯一索引、联合索引、覆盖索引、前缀索引
11)联合索引中间可以有 null 值吗,为什么,测试过吗?
12)B+ 树的特点,原理
13)B+ 树索引和 Hash 索引的区别,优劣
14)了解死锁(DeadLock)吗
什么是死锁?两个线程互相请求对方的资源,并且不释放自己的资源,形成循环等待,导致死锁。
死锁的四个必要条件?互斥条件、请求和保持条件、不剥夺条件、循环等待条件
如何避免/预防死锁?破坏四个必要条件其中之一即可:
破坏互斥条件:不可行 破坏请求和保持条件:线程启动时一次性请求完所有需要的资源,运行途中不允许请求其他资源 破坏不剥夺条件:请求新的资源时得不到满足,必须释放已经保持的所有资源,待以后需要时再重新申请 破坏循环等待条件:给资源编号,只允许顺序申请资源
15)MySQL 怎么解决死锁的
16)平时遇到过死锁吗,怎么解决的
17)JVM 的垃圾清除说一下
18)垃圾收集算法有哪些
三大垃圾收集算法:
Mark-Sweep(非移动式算法,不需要 STW) Mark-Copy(新生代垃圾收集算法,移动式算法,需要 STW) Mark-Compact(移动式算法,需要 STW)
19)介绍下知道的垃圾收集器有些什么
新生代:
Serial(Mark-Copy、单线程) ParNew(Mark-Copy、多线程) Parallel Scavendge(Mark-Copy、多线程;关注吞吐量;自适应调节策略) 老年代:
Serial Old(Mark-Compact、单线程) Parallel Old(Mark-Compact、多线程) CMS
Mark-Sweep、多线程; 追求低延迟; 四个阶段(初始标记、并发标记、重新标记、并发清除),第一和第三阶段需要 STW; 采用 “增量更新” 解决 “对象消失” 问题; 一般还会设置 Serial Old 做老年代收集预案,因为 CMS 会出现并发失败问题 “Concurrent Mode Failure”(无法处理“浮动垃圾” 导致堆被完全占满而报错 or CMS 垃圾收集运行期间预留的内存无法满足程序分配新对象的需要),这时候就会触发 Serial Old 用 Mark-Compact 算法做老年代收集; CMS 基于 Mark-Sweep 算法会有大量空间碎片产生,往往会出现老年代还有很多剩余空间,但就是无法找到足够大的连续空间来分配当前对象,而不得不提前触发一次 Full GC 面向全堆:
G1
Mark-Copy、多线程; 四个阶段(初始标记、并发标记、最终标记、筛选回收),第一和第三和第四阶段都需要 STW; 采用 “原始快照” 解决 “对象消失” 问题; 面向局部收集、基于 Region 的内存布局; 非纯粹地追求低延迟,而是在延迟可控的情况下获得尽可能高的吞吐量; G1 无论是为了垃圾收集产生的内存占用还是程序运行时的额外执行负载都要比 CMS 要高; 目前在小内存应用上 CMS 的表现大概率仍然要会优于 G1,而在大内存应用上 G1 则大多能发挥其优势
20)垃圾的判断方法,引用计数法为什么用的没有 GCRoot 的多,缺点是什么,为什么
两大方法:
引用计数法(无法解决循环引用问题) 可达性分析法
两个阶段:根节点枚举、对象图遍历 可扩展根节点枚举必须进行 STW(OopMap,安全点和安全区域);三色标记法分析为什么对象图遍历理论上也必须进行 STW(浮动垃圾、对象消失),因为这个阶段时间较长所以设计了两种方案(增量更新、原始更新 SATB)使得对象图遍历不需要进行 STW
21)平时测试过 JVM 的垃圾清除吗
22)Redis 的了解,介绍下
可以说下 Redis 是基于内存的,单线程工作的缓存,先介绍下为什么说 Redis 是单线程的(关键点:IO 多路复用、文件事件处理器);然后可以介绍下除了基于内存和单线程,Redis 还有哪些特性使得它那么快(Redis 特殊设计的数据结构 ziplist、skiplist,SDS 等;Redis 的虚拟内存机制)
23)Redis 的持久化
两大持久化机制:
RDB:存储数据库状态,二进制文件 dump.rdb
;SAVE
、BGSAVE
fork 子进程自动间隔性保存AOF:追加写入,存储命令(先写入 AOF 缓冲区,根据 appendfsync
参数决定何时写入并同步磁盘);AOF 重写、fork 子进程 AOF 后台重写(AOF 重写缓冲区)
24)算法题:删除链表的倒数第 k 个节点
心之所向,素履以往,我是小牛肉,小伙伴们下篇文章再见
回复『春秋招』我拉你进交流群