背景经历
当时我工作近5年,明显感觉到了瓶颈期。说句不好听的成了老油条,可以每天舒服的混日子(这也有好处,有时间准备面试)。这对于个人成长不利,长此以往可能面临大龄失业。所以我觉得需要痛下决心改变一下现状。我定的目标就是进大厂,因为我觉得小厂做到我目前的程度已经很难有很多的提升了。
去年暑期面了阿里很多部门,现在已经成为了阿里的一员,把我之前的面经再拿出来分享给大家
部门A
一面 (已过)
介绍自己的RPC项目
BIO 和 NIO的区别?
项目中负载均衡怎么实现的
一致性哈希在某节点宕机时怎么保证一致性的?
了不不了解hessian协议(不太了解)
Zookeeper有几种角色?
Zookeeper集群节点宕机了怎么发现剔除的?
List Set Map 讲一下
HashSet底层结构
Set时间查询复杂度都是O(1)吗 (TreeSet不是)
reentrantlock、和synchronized的区别
了解死锁吗
算法题
队列实现栈
二面
介绍一下RPC项目聊起
实现高性能的RPC关键在于哪些方面(我从序列化,通信协议,IO模型三个方面回答)
项目如果要实现内存零拷贝怎么做?
有没有提供什么扩展的接口,钩子给其人或程序方便扩展。
AVL树深度差不能超过多少?红黑树时间复杂度?
讲一下什么样的情况能用动态规划?
TCP三次握手过程讲一下
TCP发数据过程中必须按顺序接收吗
Select poll epoll区别
虚拟内存和物理内存谈一谈。
聊聊GC。
还有三面
部门B
介绍一下RPC项目
负载均衡了解哪些(dubbo的四种策略说了下)
一致性哈希比其他方法的优点?(当增加或减少服务节点时,不会造成哈希表的全量重新映射,而是增量式的重新映射)
Java里的RMI了解吗?(不太了解)
除了Dubbo,还了解其他RPC框架吗(gRPC, Thirft 有什么区别)
除了NIO,还有什么?(BIO AIO)
除了Select,还有什么(Poll Epoll,区别是什么)
容器了解什么(只了解点Docker)
做题
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。
LRU 简单谈下怎么实现?(参照LinkedHashMap)
二面
印象深刻的项目介绍一下?
RPC具体讲一下?
介绍一下服务注册中心怎么做的?
为什么用Zookeeper做注册中心(优点,与其他选型对比下)
整体服务调用链路是怎样的?
JDK动态代理机制是怎么实现的(反射,再底层原理不太清楚)
负载均衡是怎么做的?
Dubbo为什么推荐基于随机的负载均衡?
序列化怎么做的?Kryo原理了解吗?
RPC中是用Spring进行管理的,那用到了事务吗(没有)
介绍一下你理解的Spring。
依赖注入有哪写方式?
为什么选用Netty来做通信框架?
还知道其他网络通信框架?
能聊聊gRPC和dubbo这两类框架区别?
有没有考虑过服务治理相关的事情吗(还没有)
现在微服务的技术发展方向有了解吗
能聊下TCP吗?
能大概描述一下HTTP请求的过程?
HTTP提交请求时可以通过Form和JSON来提交的区别?(不太清楚)
Cookie和Session区别聊一下?
RPC项目中有做单元测试吗?(没有)
聊另一个项目
为什么用MyBatis(从与JDBC、Hibernate的区别聊)
事务隔离级别有了解吗?
SpringBoot项目中用到事务了吗?(没用到)
项目中用到查询优化了吗?(用了联合索引)
建索引基于哪些原则?(最左匹配原则)
HashMap聊一下?
Java多线程编程需要注意些什么?
JVM内存区域能讲一下吗?
堆里面内存回收大概讲一下?
有碰到过内存泄漏的问题吗?
Exception体系聊一下?
Linux熟吗,会shell编程吗?
平衡树和红黑树区别?
开源社区有没有什么参与?
对什么新技术比较感兴趣?
英文怎么样,来段英文自我介绍(懵逼中,因为没准备,所以没怎么介绍好)
反问
三面
介绍学习经历。
聊下自己RPC的架构?
了解Nacos和Zookeeper的区别吗?
用的TCP还是HTTP2传输的?
有没有了解gRPC等用HTTP2传输的协议?
有没有完整比较过性能?比较传输协议的性能?序列化的性能?(没有)
为什么选用ProtoBuff?
做RPC时会做内容协商吗?
你有把自己的RPC项目用在生产上吗(没有)
学习过程中收获最大的是什么?
Netty怎么实现高性能的?
有学计算机相关的课程吗?
能描述一下堆排序吗?(介绍堆,如何构建堆,堆排序)
能用英语介绍一下怎么实现并发编程吗,两分钟就好(??我展示出迟疑)
那就换用英语介绍下进程和线程的区别把?(也不简单啊。。)
介绍自己研究生阶段的研究。
未来职业规划,喜欢什么样的岗位。
容器有了解吗(不怎么了解)
云计算有了解吗(不了解)
最近还在学什么内容。
部门C
一面
RPC项目介绍
dubbo不足,以及优化方向?(语言支持)
netty高性能主要依赖了哪些特性?
netty bytebuf工作原理,和NIO里buffer区别?
服务注册原理
负载均衡?
聊另一个项目
AQS原理
做题
1 两个线程轮流打印
2 LRU
没写好,都知道怎么弄,就是写出了bug(凉凉)
跟面试官交流时从话语中以为凉凉,隔了好久告诉我过了,可能是想在给我一个机会试试把。
部门D
一面(凉)
介绍一下RPC项目
序列化怎么实现?
主要是Kryo(两个特点介绍了一下)
那你这个序列化还是针对Java语言的,如何实现跨语言的序列化或者rpc框架?
CGLib 底层
一个类有方法a和方法b,两个方法都被代理,方法a中调用了方法b,被代理后调用a方法,a方法中调用的是被代理的方法b还是普通方法b?(求大神解答)
分布式数据一致性协议都知道哪些(2PC 3PC Paxos)
Raft了不了解
知道怎么撑爆方法区内存吗?或者说怎么动态生成很多方法? (CGlib 动态生成类、方法)
private default protected public 权限
反射可以访问private方法和属性吗?如何访问?
通过 setAccessible(true)
Spring AOP说一下
AspectJ 原理知道吗。
Exception的体系?是捕获还是抛出,最佳实践是怎样的?
Java线程的状态,状态间怎么转换
怎么打断一个线程?Thread.interupt(),怎么安全优雅实现
做题
手写LRU
部门E
一面
简单介绍下JVM。
OutOfMemory出现原因和解决办法。
堆中哪个区域不会出现OutOfMemory?
孤儿进程和僵尸进程是什么?(不了解)
线程之间的同步方式?
GC常用的垃圾回收器?
谈下对Spring的理解。
抽象类和接口的区别?
haspmap和concurrentHashmap区别?
MySQL里索引的原理?
B+树 B树 红黑树的区别?
TCP协议能不用两次握手,如果两次是对服务器影响大还是客户端影响大?
HTTP与HTTPS区别
说一下堆排序和桶排序)的基本思想和时间复杂度。
做题
1 链表找倒数第K个节点。
2 剪绳子 剑指offe原题
部门F
一面
对JVM了解哪些模块?
讲一下JVM的内存模型?
垃圾回收策略?
JVM参数、调优做过吗(没有)
类的加载过程知道吗?
线程的生命周期?
常用的线程池用过吗?有哪些?
线程池拒绝策略?
简单说一下CAS?ABA问题了解吗?
AQS了解多少?子类有哪些?
Semaphore知道吗?
项目中异常怎么处理的?
Spring的Bean怎么加载的?
循环依赖了解吗?
Spring中AOP实现原理知道吗?
JDK动态代理和CGLib的区别?
Spring的一个接口ApplicationListener了解吗(不了解)
为什么用SpringBoot,优点是什么?
实现RPC框架是怎么实现的?
除了Netty还知道哪些网络传输框架吗?
二面
dubbo容错机制
dubbo的负载均衡
Serializable和Externalizable懂吗?(不知道Externalizable)
IO/NIO/AIO区别?
JDK中NIO有哪些重要组件?
Dubbo或Netty源码中你觉得有亮点的地方。(没看过不会)
为什么现在还在用JDK8?
OpenJDK 和 Java JDK的区别?(这个问题是为了提示上一个问题的答案吗)
为什么JDK8要提供接口的默认实现,有抽象类还要这个干嘛
为什么要提供Lambda表达式?
为什么JDK8要去除永久代(除了1不受堆大小空间限制,2与Jrockit虚拟机合并 两个原因还有啥???)
说下G1垃圾回收器。
说下JUC都有些什么?
说明下AQS的实现?
说下volatile?
有哪些线程池?线程池实现原理?哪些核心参数?
当前任务空闲,corePoolSize的几个线程怎么保持活性,不被销毁?
线程interupt,怎么实现优雅的终止?
JVM提供了哪些锁(偏向锁、轻量级、自旋锁、重量级锁)
介绍下红黑树最坏情况下查询时间复杂度?(不懂)
跳表了解吗?和红黑树应用场景有什么不同?
解释贪心和动态规划以及应用场景
当时花了几个月充分准备,十六个字,**增加深度、扩展广度、覆盖死角、挖掘项目。**介绍下当时具体的准备。
- 花了近2个月时间,Spring源码,手画核心流程不少于3遍,面试前做到能熟练讲述Spring容器启动流程、事务切面流程、MVC流程。
- 两周时间,学习MyBatis源码,做到ORM框架主流程心中有数,这块学得不是特别深。
- 花了很长的时间深入的学习JVM和并发编程,尤其是并发编程这块,从不同角度深入理解并发编程。最终进字节这块起了很大作用。对锁有深入认识,**阅读JVM synchronize关键字源码不下10遍,**对其中的大部分细节了然于胸,绘制了流程图,大家可以参考看看。当然,各类其他锁也都有学习源码,能深入比较各类锁的特点。
- 一周恶补MySQL,对于索引、锁、SQL优化重点掌握(深度略有不足,后期面试过程中有一定加强)
- 面试前,一周时间突击了网络编程,重点在基本知识和Java原生网络编程方面,Netty略微学了一点。增加深度就是主要从以上6个专题的学习体现的。都是Java开发必备的基本技能,一定要有深度。
下面讲下扩展广度,各类知识广泛涉猎。
- 面试前穿插一周时间学习Redis,redis我是用过的,但是用得很浅,专题学习下来收获很大,开阔思路。重点在redis应用和高可用架构。
- 同时穿插一周学习分布式事务、分布式锁等等解决方案
- 两三天时间Dubbo基础,放弃源码部分,掌握RPC框架核心思想
- 两三天时间ZK基础,放弃源码部分,掌握ZK精华,及常问面试题
- 了解一些MQ的相关基础知识,没有过多学习,主要是没时间了
以上几个分布式相关专题略有涉猎,多年分布式的应用经验,需要有一定的知识广度,才能做出较合理的技术设计。
之后就是覆盖死角,主要从核心面试题出发,我当时找到一份《Java高级进阶快速面试指南》,是一份Github总结的比较精炼的题库,查缺补漏,做到各类知识都能有所涉猎,**不至于冷门问题一句话也说不上来。并且自己为了加深自己的记忆也在复习过程中整理了学习大纲以及完整的学习资料,个人感觉还是非常全面和详细的,不管是零基础还是面试复习都可以直接来看
总结
最后提几个小建议:
- 对简历上的内容一定要有把握,不要给自己挖坑;
- 面试遇到不熟的内容,简单介绍下自己的认识,承认了解有限,不要硬着头皮瞎说;
- 尽量通过亮点项目和准备充分的问题体现自己的价值,也可以通过这些内容引导面试官问自己擅长的领域;
- 常见非技术问题有所准备,不至于当场抓瞎;
- 算法数据结构要有准备,面试经常要手写code。