背景


菜鸡一枚,在实习期间面了广州的BIGO和唯品会,两家公司到HR面说不招22届的,然后就没找了。并且苏州华为离宿舍只有几站路,本来以为躺着都能进华为,结果今年苏州华为压根不怎么招见习生(但是HR一直拖着,说走流程、马上开始、正在安排),拖到返校想着不能和华为继续拖下去了,重新审视了一次简历,发现项目上只有一个简单秒杀和一个CRUD的项目,然后花了大半个月做了两个项目,应对完接踵而来的考试。然后开始投简历找实习,此时大概是6月28号。
到了7月份,朋友要么不实习或者早就有了offer,此时导师两次询问我实习情况和内推(但是我太菜了,内推失败了),一直到7月7日都没收到offer,这段时间每天失眠,不过7月7日的时候,连续几天收到了几个offer,先后顺序应该是京东(数科、零售)、滴滴(北京、杭州)、爱奇艺(上海、上海)、百度、金仕达,今天就说一下我面试滴滴的经历,后面还会分享一些我的学习方法和资源库

一面:

  1. 自我介绍

  2. 写题,括号生成

  3. 问项目,我说写了个连接池。问连接池空闲连接太多咋办(空闲时间),如何保证协程拿到的链接不重复(获取链接的时候加锁)

  4. 问项目,为什么用rpc不用http,为什么用消息队列,恶意操作有发了很多消息怎么办(我乱说一顿,最后直接问我了解kafka内部嘛,我说不了解,就没问了)

  5. redis持久化方式

  6. 说说协程,我大概说了下,然后不会go,问让用java支持协程你怎么做

7.项目:为什么要多级缓存,进程地址空间多大

  1. DockerFile最大的层数(后来在网上也没查到)
    9.怎么保证Redis和数据库的同步(库存补偿)
    10.项目中如何解决粘包、拆包的问题(基于字符或者基于长度)
    11.如何保持长连接( Netty )
    12.如何实现心跳保持( IDLE编解码器监听事件)
  2. Netty为什么快(基于NIO+零拷贝)

二面(技术栈)

JUC

你看过《Java并发编程的艺术》,说一下Symchronized的原理(对象头、锁升级机制)

线程池大全套(执行流程core->BlockingQueue->max),(BlockingQueue->四种阻塞队列),(拒绝策略->JDK四种、DUBBO和Netty扩展的两种),(max啥时候会回收)

什么情况下使用什么样的阻塞队列(linked、array、同步队列、优先级队列的不同)

AQS介绍一下(state可重入、读写锁、如何实现公平,非公平)

HashMap、ConcurrentHashMap大全套

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)

三面:记得比较全

1.进程通信方式

2.fork,fork_v区别(不会)

3.零拷贝应用

4.top 有哪些cpu时间,网络多那个多,io多那个多

5.read socket返回-1是什么情况

6.read ,对面宕机了你应该怎么处理(读全局变量ERRNO)

7.如何创建守护进程

8.unix域套接字有啥好,有啥缺点

9.如何学习操作系统知识的

10.java线程有那些状态

自旋锁应用场景,你能举个例子嘛?

11.能来实习嘛

  1. 你想从事哪方面工作

面试结束复盘查漏补缺

面试本质是一个自我优势展示的过程,不要把面试变成面试官问一句自己回答一句,主动抛出一些可能的点等面试官来问,比如我基本都被问到了DB和缓存之间怎么保证数据的一致性,其实都是我自己刻意往上引的,比如面试官说,你用过Redis吗,你可以说,用过,一般用来作为缓存配合MySQL提高性能,需要注意它们之间数据的一致性问题(不要太刻意,自己把握分寸),面试官大概率会接着问你是怎么保证的

以下最新总结的阿里P7资深Java必考题范围和***含最全MySQL、Redis、Java并发编程等

刷面试题(点击此处获取文档的完整版

  • 2021大厂面试题65份


  • 知识点最全的java面试宝典(共227页)

Leetcode算法刷题

刷leetcode,刷leetcode,刷leetcode!重要的事情说三遍,作为一个程序员,代码写的烂就是原罪,面试时前面答得再天花乱坠算法写的捉急也没用,只会让面试官产生你是背面经的感觉,所以写算法题还是要快准狠,快速无bug写出最优解在面试官那里是非常亮眼的,这个是没有捷径的,我自己这次面试leetcode高频300题刷了好几遍,面试算法很顺利,当然最主要的还是刷中等难度的题,hard题性价比太低,反正我没怎么刷...
  • Leetcode算法刷题宝典(共666页)

  • Java数据结构和算法.(第二版)(共584页)

算法刷题LeetCode中文版(共264页)


算法刷题100天


MySQL调优




微服务

-Spring Cloud Alibaba全解



2021备战秋招全套资源库(点击此处获取完整版文档


不要眼高手低,不少小伙伴看面经觉得自己啥都会,但是自己会与面试过程中能清晰有层次的说出来是两回事,并且自己会到什么程度,有个说法很好,判断你是不是真的掌握一个知识的一个点在于你能不能通过通俗易懂的语言教会一个完全没有相关知识背景的人,如果这可以做到,那对知识的掌握一定是融会贯通的,面试过程中一定可以信手拈来。比如volatile关键字的原理,能不能说出点面试官眼前一亮的东西,和别的同学蜻蜓点水不一样的感觉,这还是不容易的