(转)2019最全字节面经
作者:卑微搬砖工
链接:https://www.nowcoder.com/discuss/216588?type=all&order=time&pos=&page=2
来源:牛客网
1.计算机网络
1.从输入 URL 到页面加载完成,中间发生了什么(基本必问的问题了,因为这个问题能考察对计算机网络整体的掌握程度,以及方便面试官扩展问题);
2.多进程多线程浏览器(比如 Chrome),主控进程,插件进程,GPU进程,每个 tab 一个进程,tab 进程内有网络请求线程等;
3.协议栈各层各说一些协议(记一下常用的);
4.HTTP(基本描述,Method,协议版本及新版本特点,请求响应报文结构,常用请求头字段,常见响应状态码(每类记几个),RFC规范(知道这个词儿是啥就行了)等);
5.单拎出来的缓存问题,结合状态码 304 可能问到,相关头字段,If-Modified-Since 和 Last-Modified,If-None-Match 和 ETag,它们的区别等;
6.单拎出来的 cookie 和 session 问题,搞清楚它们是干啥的,相关的头字段,其中 session 可能扩展到分布式上;
7.单拎出来的跨域问题,了解下浏览器同源(协议,域名,端口)政策,对后端的限制(AJAX等,前端问题暂不考虑),解决方法(JSONP,WebSocket,CORS),CORS(Cross-Origin Resource Sharing)相关内容,头字段 Origin,Access-Control-Allow-Origin 等;
8.HTTPS(基本描述,主要作用,
和 HTTP 的区别,
SSL/TLS 握手过程,
为什么过程要这样设计,
对称/非对称加密,
公私钥,证书,签名,CA,浏览器校验,加密算法(这个我并不懂)等);
9.DNS(基本概念,流程,缓存,hosts 文件,DNS服务器层级,迭代/递归查询等);
10.SOCKS(了解下这是干啥的,以及基本流程);
11.传输层(端到端通信服务,多路分解与多路复用,端口号的作用,套接字);
12.TCP(必问,需要清晰掌握,简单列举一下)
a.基本特点,
报文头大小与具体结构,
序号/确认号作用,
控制位及各自含义,
可选头的时间戳(简单了解);
b.面向连接,
三握四挥(记清楚),
握手的 SYN 洪泛攻击,
挥手的 FIN-WAIT-2 以及 TIME-WAIT 状态,
两次挥手后的 TCP 半开,
四次挥手后的等待,
MSL 时间,
time-wait 的快速回收,
fin-wait-2 的设定时间;
c.TCP 连接能否感知对方是否在线(规范不能,实际可以),
TCP 保活机制(SO_KEEPALIVE),
保活参数(保活定时,失活前检查参数等),
应用层面保活(心跳包,ping/pong 包等));
d.可靠传输,
结合序号/确认号说明,
停止并等待 ARQ,
结合流水线/滑动窗口的连续 ARQ,
超时重传机制,
RTT,
RTO,
差错恢复机制,
GBN,
SR,
快速重传(冗余 ARK)等;
e.流量控制,目的(防止接收方缓存溢出导致分组丢失),
基本原理,不足及改进(匹配相差一个 RTT,接单了解一下);
f.拥塞控制,目的(避免网络拥塞),
基本原理,慢启动,拥塞避免,快速回复,快速重传,AIMD(加法增大乘法减小),
导致网络通讯波动(同时进入控制状态,时大时小),随机早期检测算法(了解一下);
13.UDP(可能作为对比来问,无连接,尽力而为,面向报文,无各种控制,一对一,一对多,多对多,首部大小及结构,校验和计算过程(求和,溢出回卷,反码,校验等),可能间插着问问正反补码);
14.TCP,UDP 伪首部,虚拟的数据结构,参与计算校验和,简单了解;
15.网络层(主机到主机间的逻辑通信);
16.IP (感觉其实传输层以下问的不多,能说出来就行了。v4/v6,点分十进制,各类地址空间,DNS,NAT,DHCP,路由寻址,EGP(BGP 看一下留个印象),IGP(RIP,OSPF 留个印象));
17.ICMP(知道类型 0 和类型 8 报文是啥(Echo 响应与请求),ping 的流程);
18.ARP(地址解析协议,了解一下流程什么的);
19.MAC(介质访问控制协议,简单了解一下);
2.关系数据库(实际上主要指 MySQL)
1.范式,背下来吧;
2.基本 sql 语法(这个我真记的不咋行,因为平时用也都是要查查的);
3.数据结构(B 树,B+ 树,插入分裂,删除合并等,结合 MySQL InnoDB,结合聚簇索引,B+ 树的好处(B+ 树方便遍历,内容在叶子所以效率稳定,IO 吞吐更大开销低));
4.索引
a.哈希索引(InnoDB 自适应);
b.聚簇索引/非聚簇索引;
c.主键索引/唯一索引/二级索引;
d.单列索引/联合索引;
e.覆盖索引;
f.最左匹配,查询回表等;
g.索引优缺点(加快检索速度,加快多表连接,额外空间开销,维护索引的额外时间开销);
h.适合不适合建立索引的字段等;
j.索引无法使用的情况(模糊匹配,OR 前后没有同时使用,联合索引的最左匹配等);
5.事务(集中式)
a.事务的基本概念,事务的提交,回滚等;
b.ACID特性;
c.事务的并发问题(第一二类丢失更新,脏读,不可重复读,幻读);
d.隔离级别(读未提交,读已提交,可重复读,串行化);
e.事务的支持,InnoDB;
6.数据库锁
a.锁的概念和大类别(悲观并发控制,乐观并发控制,MVCC 等);
b.数据库锁的类别(主要是悲观锁,表锁/叶锁/行锁,意向锁,共享锁/排它锁,更新锁,记录锁/间隙锁/Next-Key锁等);
c.InnoDB,索引加锁,行锁的使用(比较执行代价),行锁死锁(所以行锁复杂),意向锁(解决行表锁冲突),行锁(记录/间隙/Next-Key),更新锁(避免先S后X的死锁)等;
d.锁时效性(临时锁,持续锁);
e.加锁协议(一/二/三级加锁协议,二段锁协议(充分条件),一次封锁法等);
7.MVCC 的概念,时间戳版本号,快照版本与当前版本,适用场景等。
8.NOSQL(主要指 Redis,本人仅限于有限的使用和了解)
a.基本数据类型;
b.部分支持事务,单线程(串行,无锁)等;
c.淘汰策略(六种,可能挑出来 LRU 问);
d.持久化问题(RDB 快照与 AOF 操作日志);
e.zset 的数据结构(跳表,了解一下);
f.消息队列(不是 Redis 的设计目标)。
3.基础数据结构
数组,链表,树,堆,队列,栈,图,都看一看概念,别到时候卡壳,结合语言;
BST,AVL,红黑都了解一下。DFS,BFS 结合回溯法和分支法。图感觉我们搬砖的用的也不多,看看最短路径之类的;
4.基础算法方面
时间/空间复杂度的含义,基本二分,变种二分,基本排序以及它们的各种特点,六大基础算法类型等;
小心动规。。。
5.其他
1.进程与线程(可以结合语言说);
2.死锁等;
3.分布式数据库事务,CAP,BASE,二次提交协议等;
4.正则表达式,简单了解一下;
5.设计模式,简单了解一下;
6.面向对象概念,特点,原则;
7.各种工具的使用,如 Git,Maven等;
8.Linux 的基本使用;
9.IO模型(同步/异步,阻塞/非阻塞),BIO,NIO,AIO,IO多路复用等;
10.反向代理,
负载均衡,
微服务架构的注册和管理,
多节点缓存,
CDN 内容分发网络,
DNS 轮询等,可能结合具体的工具说,如 Nginx,ZooKeeper 等;
11.Twitter雪花算法了解一下;
12.海量请求问题,海量数据问题;
6.Java 相关(非 Java 的同学简单参考下)
1.有时间的把《Java 编程思想》,《Java 核心技术 卷 I》,《深入理解 Java 虚拟机》翻一下;
2.基础知识,如重载重写,继承多态,关键字等,记清楚;
3.Java 数组,
容器集合包/类,
常用容器,
以及相应静态工具包/类,
HashMap 底层(红黑树警告),
ConcurrentHashMap 原理等(1.8前后变化,分段锁变成 CAS 了);
3.IO/NIO 包,主要结合 IO 模型说(实际上 IO 包已经用 NIO 包重新实现过了);
4.并发(包),Java 关键字,锁等
5.Thread,Runnable,Callable,Future,ThreadLocal 等,会用,知道区别;
6.线程池体系,
ExecutorService,
ScheduledExecutorService 等接口,
ThreadPoolExecutor,ForkJoinPool 等实现类,
Executors 静态工厂类,
线程池的核心参数,
几种不同类型的工厂线程池等,会用,了解一下;
7.几种常用的阻塞队列,这里很大可能会让写个简单的阻塞队列(生产者消费者),
参考下 ArrayBlockingQueue 里面的,用 ReentrantLock 和 Condition 简单写一下就好了;
8.几种并发构件,倒计时栅栏,循环栅栏这些,说实话我不常用,简单了解下吧;
9.synchronized 关键字,首先知道它是干啥的,其次了解咋实现的,我认为至少要讲到 monitor 面试官才会满意,
其间可能牵扯到堆中对象头结构(这里还可能牵扯到数组的 length 属性咋来的),
还可能牵扯到锁优化(偏向锁,自旋锁,轻量级锁,锁粗化,锁消除(这里还可能牵扯到对象逃逸等),对象头的 Mark Word 复用等);
10.Lock,主要是 ReentrantLock,要了解 AQS 的基本工作原理,包括同步队列和 Condition 的等待队列等(和 monitor 的队列很像),
了解它的 states 状态是用 CAS 算法更新的,
了解公平/非公平,了解自旋/挂起;
11.了解 CAS 的基本原理,知道 Java 中的 Unsafe 类(知道用这个东西就行了,直接操作内存的,基本用不到);
12.原子类,信号量,了解一下;
13.了解经典的进程线程模型(内核线程,轻量级线程,用户线程等),
了解 Java 的线程调度策略(抢占式,系统决定),
了解 Java 线程优先级(不一一对应,程序不应该依赖于优先级);
14.了解 JMM,
了解可见性问题(由此引出 volatile 关键字),
知道 volatile 能解决可见性(区别于原子性)和重排序问题,由此引出有序性的先行发生原则(happens-before)。
15.JVM 运行时内存区域(虚拟机栈,本地方法栈,程序计数器,堆,方法区(1.8前后变化,永久代被元空间替代了)等,
了解栈和堆的区别(小细节:非逃逸对象的栈上分配),
了解线程私有区域和共享区域等(比如一个怪问题,布尔值所占的空间大小));
16.垃圾回收算法,
引用计数法,
可达性分析法(引出强软弱虚四种引用),
两次标记(引出 finalize 方法),
标记清除(碎片,CMS),
标记复制(Eden,Survivor,分配担保,新生代),
标记整理(老年代),
分代,
GC 停顿,
Stop The World(砸瓦鲁多),
安全点/区域等;
垃圾回收器(七个,记一下特点);
17.JVM 对象分配回收策略(Eden 优先,大对象直接进老年代,长期存活进老年代,动态年龄判定等);
18.类加载器(Bootstrap,Extension,Application 以及自定义的),
双亲委派(能否破坏,loadClass 方法),
加载流程(加载,验证,准备,解析,初始化),
加载时候生成方法区对应的类的数据结构,
以及生成对应的 class 对象(小细节问题:数组没有对应的类,怎么生成的),
准备过程(分配类变量空间,赋值后延到初始化),
初始化过程(结合 Java 新建对象各部分执行顺序分析);
19.class 对象引出反射,引出代理(Java 代理和 CGLib,了解一下);
20.框架(主要指 Spring)了解一下,IOC 和 AOP 的概念与原理,感觉框架问的并不多(实际上 Java 问的就很少)。