6.24 一面 70min
自我介绍
问rpc造轮子项目
rpc用的什么协议?
介绍自己的协议
自己定义的协议为什么要有魔数?
netty如何解决拆包粘包问题
rpc是多路复用的吗?
对netty的了解?
netty并发处理模型?
netty为什么性能高?
netty做了什么优化
java范型 怎么体现?原理? 不会,只能扯点Java是假范型,讲了讲范型擦除,面试官追问原理,只能说不会原理。
volatile 作用?可见性是什么
GC 如何回收垃圾?引用计数法 可达性分析
可达性分析如何解决循环引用 问懵了
引用计数有什么优点?
为什么简单就性能好?
数据库explain
explain 字段?
mysql预编译
算法
1.char[] i am in Shanghai -> char[] shanghai in am i
不让用String split函数,只能用reverese实现。后来说了思路 就是先反转整个句子,再单独反转单词。但是我空格边界处理的不好,这里一直磕磕巴巴没搞完。
7.2 二面 45min
到点了面试官没来,打电话让hr催了一下,面试官迟到了15min。自我介绍
HTTP请求响应的数据结构
HTTP传输的什么数据 怎么编码的
可以传什么数据 什么格式(讲了json xml,图片用二进制之类的)
怎么判断发来的是json还是xml (我说的提前约定好发什么格式,或者头部里的k-v里写明是什么格式的数据
你接触过哪些http头部
post和get区别
状态码304啥意思
接口和抽象类区别
什么情况你用接口什么情况用抽象类(举了个例子
volatile
A a = new A(); 对象存在哪里,引用存在哪里(对象在堆上,引用在栈上
mysql主键索引数据结构(B+树
为什么用B+树(分析了一波B/B+/红黑树
二级索引用什么数据结构(讲了一波二级索引需要回表之类的
一个表,第一列是id,第二列是金额,A给B转钱,怎么做?(说了开启事务做操作
并发的情况下怎么保证不会多转钱(说了mysql会加锁,说了说3个行锁
怎么加行锁(我以为是原理层面,说不会,面试官说是使用层面,大概想让我说一下语句,不会。。
场景题:定时任务模块,注册定时任务,注册需要用到两个参数,一个参数是函数,一个参数是时间戳,注册之后需要触发函数。怎么实现?
绕了一圈面试官目的是想让我说用什么数据结构存这个注册任务,被场景题绕晕了,刚开始说的数组轮询,后来面试官说用单链表怎么做,刚开始有点懵,后来醒悟过来说从小到大排序,每次都头节点取,这里分析了一下时间复杂度,插入和删除之类的。有序链表插入时间复杂度是O(n),问我能不能优化,然后说了下用跳表,单链表插入主要是查找的过程是O(n),用跳表可以降到O(logN)。中途面试官还问了数组和链表的区别。
最后反问环节面试官给我说这个最优解是最小堆。唉,其实很简单,套了个壳子就不会做了,第一次做场景题,有点紧张有点懵。
7.12 三面 70min
自我介绍(提到了发论文
简单介绍一下你发的论文(介绍完了面试官说看来你算法功底很好,吓我一跳...赶紧说没有没有,可不想给自己挖坑
开始问基础知识
先从OS问起
虚拟内存是什么
缺页中断具体过程(不会
页面置换算法
让你实现LRU,思路是什么?我说了LinkedHashMap
面试官说不让用api,自己想思路(说了双向链表+map
用单向链表可以实现LRU吗?(触及到知识盲区了,没思路
文件inode(这块没复习到,随便说了两句就投降了
linux文件权限(说了执行ls命令后显示的dxrwxrwxrw分别是自己,所在组和其他人对应的权限
开始问网络
面试官说TCP三次握手四次挥手肯定问烂了,就不问了(其实我前两面这个都没被问。。
拥塞控制了解吗(详细讲了讲慢开始、拥塞避免、快恢复、快重传
一般情况下TCP可靠性更好、速度比UDP慢,如何设计一个既有UDP的效率,又要有TCP的可靠性的协议?(刚开始没什么思路,面试官提醒可以从拥塞控制入手。我就说不用慢开始这一套,用一个比较恒定的速度去传输数据,至于发送速度恒定在多少,这里提到了jdk的synchronized优化后里有个自适应cas来确定自旋多少次,可以参考这个思路来确定以什么速度发送会获得比较好的效果。面试官后面表示我这个借鉴思路还不错,夸了我一波
开始问项目
介绍一下rpc轮子项目,这里简单讲了一下原理
讲一下非阻塞和异步
netty是怎么实现的(基于NIO,IO多路复用,讲了讲netty的3个线程模型
IO多路复用具体原理(讲了讲select、poll、epoll
管理100w个连接也很困难,epoll是怎么做到的?(不会
epoll的边缘触发和水平触发
什么时候用水平触发 什么时候用边缘触发(这个不太会答,说根据业务来选择,精细化控制,不想错过任何数据就用水平触发,只要有数据就触发的话就使用边缘触发
netty用的哪个(两种触发都支持
数据库
redis的zset底层用的什么结构(跳表
为什么mysql用b+树,redis用跳表(这个说实话没想过,现想的,感觉答得不是很好,扯了扯mysql需要磁盘io,redis基于内存不需要磁盘io,跳表实现简单,能扯上点关系都说了说
mysql用了b+树都哪些优点(叶子节点有序,磁盘预读,树的深度小
redis用跳表的原因(实现简单,复杂度不高,支持范围查询
跳表在什么情况下加层(不知道
数据库的隔离级别
脏读是什么
怎么解决脏读
幻读是什么
怎么解决幻读(讲了next-key lock锁和mvcc
mvcc原理
为什么mysql不用可串行化解决幻读(并发度小
手撕代码
手撕之前面试官说我之前做的都挺简单的,对我来说肯定很容易,你又是做算法的,给你整个稍微难一点的(我??
第一题 n*n的棋盘,从(i,j)开始只能上下左右走,走k步后棋子还在棋盘上的概率? 类似Leetcode688
不太会做,想了个思路用BFS/DFS先算出走k步的所有可能数,再同样方法算出走k步还在棋盘的可能数,再相除。面试官说这个会爆栈。估计用dp做,但我没什么思路面试官就换题了。
第二题 手撕LRU。leetcode146
反问
问了对于应届毕业生,找后台开发的话应该该怎么准备。觉得面试官的回答挺有意义的,特意摘出来给大家分享一下。
总结来说就是不在乎你学了多少上层的工具,你把OS、网络、数据结构、数据库这些学好,把基础夯实了,再去学上层会比较快。如果你能和linux代码贡献者一样对linux很熟悉,并且其他几门课的基础很扎实,那么以后解决问题的时候可以从很多其他地方借鉴思路,这里提到了我上面借鉴自适应cas的思路,算是对我的一种肯定吧。
全部评论
(16) 回帖