个人情况和废话
菜鸡一枚,在疫情期间面了广州的BIGO和唯品会,两家公司到HR面说不招22届的,然后就没找了。并且苏州华为离宿舍只有几站路,本来以为躺着都能进华为,结果今年苏州华为压根不怎么招见习生(但是HR一直拖着,说走流程、马上开始、正在安排),拖到返校想着不能和华为继续拖下去了,重新审视了一次简历,发现项目上只有一个简单秒杀和一个CRUD的项目,然后花了大半个月做了两个项目,应对完接踵而来的考试。然后开始投简历找实习,此时大概是6月28号。
到了7月份,朋友要么不实习或者早就有了offer,此时导师两次询问我实习情况和内推(但是我太菜了,内推失败了),一直到7月7日都没收到offer,这段时间每天失眠,不过7月7日的时候,连续几天收到了几个offer,先后顺序应该是京东(数科、零售)、滴滴(北京、杭州)、爱奇艺(上海、上海)、百度、金仕达
正式面经
由于我面试都是没有录音的,也很少复盘(菜鸡的本质),所以都是回忆版,尽最大可能的记录一下。
不会的问题加粗
一、滴滴(这次面试体验最好的部门,效率非常高)
在牛客网上投递的,面试体验真的很好,最后由于一些个人原因没去成,感到有点内疚。
一面(项目)
- 自我介绍
- JVM内存区域以及作用(堆、元空间、方法栈、本地方法栈、程序计数器)
- JVM垃圾回收算法、常用收集器及工作流程(CMS、G1、ZGC)
- 秒杀项目如何进行压测(Jmeter)
- 限流怎么做的(令牌桶,令牌桶实现挺简单的,但是很少人做了秒杀的人会了解,特别是慕课那个项目)
- Redis集群怎么搭建的(Docker)
- 分布式锁的原理是什么、怎么做的(解决多个机器间的资源互斥)
- DockerFile最大的层数(后来在网上也没查到)
- 怎么保证Redis和数据库的同步(库存补偿)
- 项目中如何解决粘包、拆包的问题(基于字符或者基于长度)
- 如何保持长连接(Netty)
- 如何实现心跳保持(IDLE编解码器监听事件)
- Netty为什么快(基于NIO+零拷贝)
- zookeeper怎么实现注册、发现的(临时节点存储ip+端口+负载均衡策略)
- 为什么不选择Redis作为注册中心(zookeeper临时节点自动宕机自动清除)
- ZAB算法讲一下(ZAB是paxos的改版,Mysql是paxos、redis sentinel是raft、zookeeper是ZAB、ZAB的具体实现)
- JWT的英文名是什么(JSON WEB TOKEN)
- REDIS呢?(Remote Dic Server)
- 分布式事务的几种解决方案(2PC,3PC,TCC,基于消息,然后顺带讲了一下优缺点)
- 反问
二面(技术栈)
JUC
- 你看过《Java并发编程的艺术》,说一下Symchronized的原理(对象头、锁升级机制)
- 线程池大全套(执行流程core->BlockingQueue->max),(BlockingQueue->四种阻塞队列),(拒绝策略->JDK四种、DUBBO和Netty扩展的两种),(啥时候会回收)
- 什么情况下使用什么样的阻塞队列(linked、array、同步队列、优先级队列的不同)
- AQS介绍一下(state可重入、读写锁、如何实现公平,非公平)
Netty
- 你看过《Netty实战》,介绍一下Netty,可以从工作方式方面(线程模型->主从Reactor、BossGroup、WorkerGroup区别、EventLoopGroup与线程池的关系、EventLoop、Pipeline、ChannelHandler、Context)
- 有哪些框架的底层使用的是Netty(RocketMQ、DUBBO、ElasticSearch)
- NIO介绍一下(Selector、Channel、ByteBuffer,IO多路复用,底层的select、poll、epoll(这里我只是了解,不清楚具体实现))
JVM
- 你看过《深入理解Java虚拟机》,看完了吗(只看到GC、后边没看)
- JVM全套(内存区域、GC算法、垃圾收集器、双亲委派机制、类加载机制)
- JVM调优了解吗,OOM了怎么排查(拷贝Dump文件,使用工具查看)
- 了解哪些工具(JvisualVM、Jprofiler、Jstack)
- Jmap了解吗(no)
- 如果想把JVM内存固定为32M如何操作?(XMS、XMX同时设置)
- 你看过《Java编程思想》,评价一下这本书(博大精深,内容太多,记不住,但是某些比如面向对象、static和类绑定这些还是留下了深刻印象(面试官:我也是上学的时候看的。早就忘得差不多了,内容太多了。)还好没装逼)
- 《Java编程思想》当中介绍的设计模式有哪些(设计模式我不熟悉,但是IO中采用了适配器模式)
- 介绍一下适配器(没说出来)
- Redis数据结构(String、Hash、Set、Zset、List、Hyperloglog、Bitmap、Grospatial、BloomFilter)
- 用过哪些(写Demo都用过,用的最多的还是String)
- Redis底层是什么数据结构(Zset是跳表,String是SDS)
- 跳表讲一下
- Mysql聚蔟索引和非聚簇索引的区别(讲了Innodb和Myisyam的区别,文件结构,和两种索引的区别)
- 所以何种情况下使用什么索引(当时没想出来,事后诸葛觉得因为聚蔟索引文件太大了,并且改变数据的时候效率比较低,要不我天天用)
- 反问
滴滴这个部门的面试体验真的很好,不知道以后还有没有机会去
滴滴(面试体验也非常好,但是offer发的慢)
一面(闲聊)
一面比较轻松,大概技术面试只面了十分钟,后边一直在闲聊
- 自我介绍
- HashMap相关
- 有没有使用过爬虫,或者对爬虫这方面感兴趣吗?
- 大数据相关
- 看你了解LVS,介绍一下(三种负载均衡模式)
- 知道LVS的作者吗?(面试官说是部门的Leader写的)
- 闲聊+反问
二面(项目)
从项目上一点一点的问,如果是云的项目估计回答不出来
- 自我介绍
- 说一下秒杀模块,怎么进行优化的(主要基于Redis做优化,加入二级缓存,还有一些防刷限流的措施,后续也加入了消息队列,但是对QPS的提升不大)
- Redis集群怎么搭建的(Docker)
- 哨兵集群介绍一下(基于Raft算法,介绍了选举过程,然后指出我这使用的是分片集群)
- 分片怎么保障高可用?(将不同的数据hash到不同的库,然后通过bus自动访问到相应的数据库,每个分片再配置主从保障容错性)
- 怎么解决超买超卖的(Redis分布式锁)
- Redis分布式锁怎么实现的(setnx+setex,但是这样子不是原子性的,可以采用LUA脚本进行优化,或者直接使用Redisson框架)
- 你知道Zookeeper的分布式锁实现方式吗?(临时节点,如果服务器挂了,锁会自己消失)
- 限流的实现讲一下(令牌桶)
- 怎么保持缓存数据和数据库数据的一致性(没加入消息队列之前,这两个操作是一致的,加入消息队列之后,先预减库存,成功的话在通过消息队列减数据库库存,这里数据库使用了唯一索引来保证多次下单的幂等性,如果数据库减库存失败,会把缓存当中的库存加回去)
- 为什么要加入消息队列(异步下单提高可用性,但是好像QPS没有上升)
- 为什么QPS没有上升?(我觉得是阿里云服务器单核2G的限制)
- 你是部署到服务器上的吗,所有东西都装在一块?阿里云服务器对学生是不是有优惠?(是的,学生十块钱一个月?面试官:竟然还要钱?)
- 说一下事务的四个特性和详细介绍(ACID)
- 具体介绍一下(当时一致性具体内容忘了,为了避免尴尬,说了一下mvcc版本控制)
- 四种事务隔离级别,mysql默认隔离级别(读未提交,读已提交,可重复读,序列化,读已提交和可重复读是通过mvcc版本控制机制实现的)
- 说一下mvcc版本控制机制(undo log,隐藏字段)
- 读已提交的情况下,事务A读到的事务永远是事务A吗?(猜了一下应该不是,应该是根据版本链找到上一条已提交的事务(面试官:不用紧张,对于实习生来说这里已经超纲了))
- 这个秒杀有多少行代码(我真不知道,然后说了RPC项目大概有一千几百)
- 我们来说说这个RPC项目吧,怎么实现场链接的(Netty保证的,应该是使用了TCP的长连接特性)
- 心跳保持呢(Idle编解码器工作机制)
- 粘包半包怎么解决的(LineBased和LengthBased,我是用的是LineBased)
- 为什么要使用LineBased,怎么分割的(/r/n,当时没有考虑太多,觉得这个比较简单)
- redis知道什么(持久化、集群、九种数据结构)
- 如果用户输入/r/n怎么办(计划后续重构的时候改为LengthBased)
- 为什么要用Zookeeper(服务注册、发现)
19 redis不可以吗?(也可以,但是redis需要我自己去维护这个provider是否还存活) - zookeeper有什么特性,讲一下(临时节点、持久节点、ZAB)
- 怎么实现负载均衡策略的(我只做了最简单的轮询、加权、随机,通过在zookeeper中配置,然后将引用按照权重将Channel的引用加入到一个List当中)
- 怎么实现透明调用的(自定义一个注解,然后在BeanPostProcesser中拦截使用了这个注解的接口,然后使用Cglib动态代理进行远程调用)
- 如何实现异步调用的?(将Future储存起来,再新建一个线程去维护这个Future的状态)
- 暴击:为什么我们要使用RPC而不是使用HTTP(讨论了挺久的,我还是没回答上来)。后续整理了一下,感觉可能是当时我没理解到位想问的问题,放在这里: https://www.jianshu.com/p/f193bc194e3c
- 你这个RPC有什么地方需要改进的,和我说一下(还好我真的总结一下,写在git上边了,然后打开git给面试官看了..)
- 嗯,行,还总结了一下,那我再看看你另一个项目,说一下分布式事务的几种方式吧(2pc、3pc、tcc、基于消息)
- 2pc和3pc有什么区别?(当时我是真的忘了,不过面试官说没事,后边再去补补就行)
- 为什么要用docker部署(docker的优点)
- 项目方面先问到这里,下面我来考考你的基础吧,你知道什么排序算法?(ps:已经把我象奴的底裤都扒下来了TAT。选择、冒泡插入、堆排、快排、归并、希尔、基数)
- 用记事本写个快排吧
31.(写的过程中)你有没有博客?给我看看(我有,但是没写什么东西,但是面试官还是要,就把这个博客的地址发给他了) - (写的过程中)怎么那么多关于docker的(我最近在把微服务用docker重新部署)
- (写的过程中)看到你有个唯品会的面经,最后拿到offer了吗?(hr面挂了,只招应届的。那是我疫情期间随便投的了,那时候还没开学)
- (然后应该看到我关于redis的笔记了)你这redis写了这么多,刚才介绍怎么没说呢?(我真的不知道该怎么说啊TAT)
- 你说一下哈夫曼编码(好久没用了,一时没想起来,后来想起来是用于压缩算法的那个)
- 说一下关于图的算法(迪杰斯特拉)
- 反问(今天就到这里吧,我去和一面面试官讨论一下,后续应该没有技)
三面(基础+项目)
常规的JVM、HashMap、JUC问题,不重复了,其实二面这种情况下,三面大多数都是重复的问题,可能是一面时间太短了。
总结
这个部门给人的感觉也非常好,特别是二面面试官的方式,让我在后续的面试中可以吧问题回答的更完善
重复的问题记录有点多,下边我就不继续重复写之前写过的问题了,只写新的
重复的问题记录有点多,下边我就不继续重复写之前写过的问题了,只写新的
京东(数科)
数科的面试比较短,加起来大概四五十分钟,问题也比较简单,可能部门扩张比较缺人
一面(项目)
二面(基础)
之前没涉及到的主要是场景题
- 十亿条数据找出出现最多的top10(我只知道hash、堆排序、归并排序)
- Redis的ZSET有什么使用场景(我说了热搜)
- 滴滴如何通过用户的地点快速找出附近的车辆(每个区域的车辆设置编号,然后使用Redis的Geo数据结构进行存储)
- 如果不用Redis的数据结构呢?(我回答的是一致性哈希)
京东(零售)
这次面试是在考试的过程中,没怎么准备,回答的不是很好
一面(项目+基础)
- 秒杀幂等性怎么实现的?(当时回答的是通过版本号,那时候在考试没有了解幂等性解决的问题)
二面(基础)
- HashMap在多线程中对不同的key进行读写操作会有问题么?(回答的不会,然后说了一下扩容产生死链之类的,后续查阅资料在扩容的过程中如果发生读写还是会产生问题的)
- 秒杀用Redis缓存热点数据,怎么缓存的?(不是很理解面试官的意思,缓存不就是将热点数据存到redis当中么?后来回答了采用分片集群,但是面试官好像不是很满意,有知道的朋友可以说一下)
实习回来了,当时所说的热点数据是:前缀一样的数据,在某些数仓工具中,会存储到同一个分片上,把这一部分前缀相同的key称为热key,可以通过reverse解决热key的问题。在ridis分片集群中,key是先经过hash再存入分片当中的,所以没有热key数据的问题
百度
一面
设计数据库
- 要求建立学生、课程、选课、成绩四张表,要求设计字段及相应的数据类型并建立主键
- 然后给了五道题,写SQL,如果使用了笛卡尔积,会问怎么进行优化,大概考察连接、主键、索引、聚合函数、group by等等
二面
- Redis的内存淘汰策略
- Redis如何进行内存淘汰的
- 代码:十进制->二十六进制的转换
爱奇艺(上海)
爱奇艺面试也挺短的
一面(基础)
- 旋转数组找数字
- topk
- 全排列
二面(项目)
- DUBBO几种负载均衡的模式(轮询、随机、一致性哈希、最小活跃数)
- 介绍一下一致性哈希,一致性哈希和普通哈希有什么区别(说一下原理)
爱奇艺(上海)
爱奇艺面试也挺短的
一面(基础)
- 层次遍历
- 接雨水
- 用过什么前端技术(我就应该说不了解)
- 说一下VUE
二面(项目)
陌陌
一面(项目+基础)
Redis的SDS最多可以存储多大的数据?(512M)
二面(基础)
有好多东西好久没复习了,算是发挥最差的一次面试吧,特别难受,回去也把网络和系统复习了一遍
- Ping命令是什么协议(ICMP)
- ICMP在哪一层(脑子真的瓦特了,ping命令一般只需要ip,明显就在网络层啊,但是就是没想起来)
- 分别介绍OSI七层模型每层是干什么的(我面试的时候计网只复习了关于TCP和HTTP的,很多层没说出来)
- 交换机、集线器分别工作在哪一层
- 进程之间交互方式(没复习,只说了Socket、信号量、管道、共享内存)
- 操作系统的主要部分(没复习只说了文件系统、内存管理、IO)
HR面(KPI)
二面之后知道肯定挂了,但是HR面也不好意思不接,结果愣是面了四十多分钟,体验极差。
- 用过默默么(没有)
- 知道默默干什么的么(陌生人交友)
- 还有么(你自己不清楚?)
- 还有很多奇怪的问题,估计大家也不想看,就不写了
总结
二面差点以为我投的是嵌入式开发。
当时知道肯定凉了,反问的时候就问了:Java不是用来操控传输层以下层级的吧,怎么连集线器在哪一层都要掌握?
面试官:需要计算每个业务的流量,以更好地设计系统
快手
一面(挂)
- 链表的归并排序
- 写个单例(我写了个静态变量饿汉单例)
- 你写的这个线程安全么(static的,线程安全)
- 类加载过程讲一下(解释static为什么安全)
- 写一下DCL懒汉式
- 解释volatile的作用
金仕达(上海的一家公司)
一面
- Java的特性(一次编译,到处运行)
- 我要的不是这个,是特性(然后说了封装继承多态,这不是面向对象的特性么...)
- 具体介绍以下多态(运行时类型和编译时类型不一样)
- transient关键字的作用?(只回答了防止序列化,面试官说还有其他的)
HR面
soul
流程有点慢,等到约二面的时候我已经入职了,就没参加
百度
一面(基础)
- 分布式系统设计需要考虑什么方面(我从CAP定理的角度分析的)
- 主要是Netty和RPC框架
- 口述:将阿拉伯数字转换为汉语表达