先说说大致情况把,当时是下午两点约的一面,没想到直接面到六点一次性面完了。。。面试部门:北京的基础架构,后端开发

一面:

  1. 讲一讲 hash 表

  2. hash 冲突了怎么办?(拉链)除了拉链还有吗?(开放地址法,不是很了解,听过)

  3. 如果使用 hash 进行分布式存储有什么弊端?(可扩展性不强,例如增加节点和节点宕机的情况)

  4. 如何解决?(一致性 hash,提到了 redis 的哈希槽)讲一讲吧

  5. 一致性 hash 会出现什么问题?(数据倾斜问题)如何解决?(虚拟节点)

  6. 介绍 JVM(五大部分)

  7. 什么时候会 GC?(答 GC 过程)你说的 MajorGC 和 fullGC 有什么区别?

  8. FullGC 会有什么问题吗?(STW)什么时候会 STW(介绍 CMS 大致过程,在标记的时候)

  9. TCP 和 UDP 区别

  10. 2MSL 是什么?为什么等 2MSL?(补充说明等待的时候收到报文会如何处理)

  11. 你知道什么时候 TCP 会发送 rset 报文吗?(不知道)

  12. hashMap 介绍一下

  13. hashMap 是线程安全的吗?(不是)如何保证线程安全?(答 concurrtenHashMap)让你自己来实现呢?(使用 sy 加锁)怎么加锁(锁住 put 和 get 方法)具体一点(sy 分为类锁和对象锁)那你觉得应该加什么锁(对象锁,解释一下)

  14. concurrtenHashMap 介绍一下(主动说的)

  15. CAS 讲一讲

  16. sy 和 lock 的区别

  17. CAS,sy,lock 三者应该分别在什么场景下使用?(这个回答得不是很好,我说要看业务需求,三个偏向特点不同,简单介绍三者不同的倾向特点)

  18. 内存泄露是什么?什么时候会出现内存泄露?(静态常量不使用,threadLocal)还有吗?(不知道)

  19. 算法题:

1)输入一个 cd 命令:/hist/add/camera/../int/has/../init 输出最终的文件目录 2)现在有一百万条定时任务,是一个二元组<key,value>,key 代表触发的时间,value 代表任务。将这一百万条定时任务插入一个调度系统,设计这个调度系统的存储结构,保证两点:插入的速度快,同时保证调度系统可以实现秒级的任务调度二面:记得不是很清楚,少了部分

  1. jvm 中内存是不需要自己分配的,不像 c++需要 malloc 和 free,那你知道 window 下磁盘是如何管理的吗?(不知道)

  2. 那你知道磁盘上是如何快速计算当前的容量的吗?(可以设计一个变量,每次存进去加 size,释放就减)你可能对这方面不太了解,其实你可以了解一下,里面是用块存储的,可以用 bitmap 快速计算容量(我提问:那也会有内存碎片吧)肯定会有,这就是为什么 window 下会定时进行内存碎片的清除,你可以去了解一下 xxx(嗯嗯)

  3. 你知道一个 linux 代码文件是如何被加载到 cpu 上运行的吗?(不了解,我说我可以讲讲 java 的代码是如何被加载运行的)那你讲讲吧

  4. 你了解协议模型吗?(TCP 四层,OIS 七层,我介绍五层吧,直接讲输入 url 到显示界面的过程,详细讲了 DNS 的递归查询和迭代查询)

  5. 一个域名是可能支持多个服务的,这个怎么办?(http1.1 支持 host 域)

  6. 那在高并发的情况下,哪些服务器如何保证 dns 解析的高效性(缓存)还有其他的吗?(分布式缓存)面试官笑了笑(我解释到,要不然就是从代码上解决,要不然就是从机器数量上解决)

  7. TCP 和 UDP 的区别

  8. DNS 用的是什么协议

  9. Ping 命令了解吗?发送的是什么报文?(我说我只了解用的是 ICMP 协议,但是具体不知道)

  10. IO 模型了解吗?(BIO,NIO,AIO)

  11. 一个数据从网卡到磁盘的过程

  12. 进程和线程的区别(提到了协程)为什么协程切换比线程快(不涉及特权模式切换)为什么协程不涉及(应该是一般只用协程做用户态的事情吧,我对 go 不是很了解)

  13. 有 1000 个文件,找出出现次数最大的十个词

  14. 算法:合并有序链表

  15. 看我做过论文查重系统,问我核心是什么(本科毕设,分句算法和查重算法,用的编辑距离)能讲一讲编辑距离吗?你当时是自己写的还是用的别人的(用的 pyhton 包),那你能写一个吗?写个大概思路。(正好之前练过,有小瑕疵,没让跑,整体代码基本正确)

  16. 看你用过 k8s,了解 deployment 啥啥啥的吗?(不了解,我只是写过 yaml 文件部署,我可以介绍一下 k8s 组件,介绍了五六个组件和功能,还讲了我们之前做的负载均衡和高可用)

最后就是给我讲讲说有空可以来实习,问我要不要继续三面,还是改天,因为已经连续两面了,我说继续吧三面:

  1. 自我介绍,开始讨论项目,终于聊我的项目了。。。

  2. 数据从磁盘到程序的过程(不满意)

  3. 我又提到了 Kafka 的零拷贝(觉得有问题)

  4. 问我协议模型(五层)

  5. 三次握手四次挥手(八股文)为什么是三次?为什么是四次?(感觉不满意,和他讨论了很久)面试官认为一般是对称的,如果不对称一定是某个环节 combine 了(我说我回去再看看)

  6. linux 内存管理了解吗?怎么管理的?(其实我是不知道的,但是二面面试官正好告诉我了块式存储,所以我说了块式,然后还说了段页式)他说段页式应该是很古老的吧

  7. 现在让你自己设计一个内存管理,你怎么设计(这个地方讨论了很久,我每次有新的想法就会有问题抛出来,然后我再想。。。)最后有一个稍微觉得可以的了,说你这个设计算比较雏形的了(主要是问一个大内存怎么申请,快速查找可用空间,内存碎片怎么最少)

  8. 讲一讲 JVM 吧

  9. hashmap

后面记不清了,后面就是偏八股文了这里给大家推荐一份我面试之前看的 java 面试笔记:(扫码获取


这份资料包含了很多当下热们的 java 知识点,



不多展示了,你想要的它都有,反问:我说我想最后补充两点,算是表现一下我的优势吧:我知道可能今天表现不是很好

  • 1)我学习能力很强,简历上很多奖学金都是我自己拿的

  • 2)开发能力强,抗压能力强,百度实习期间每天工作超过十二个小时

  • 3)我对内存这方面的确是不了解,我也不解释,但是我有我擅长的领域,例如我对 java 比较了解

最后他说了一句,其实还 ok 啦,然后就没了,以为凉了,第二天 hr 说过了总体来说其实不是特别难,我觉得提前批比秋招简单。