1、基本情况
博主17届双非一本毕业
, 主要是搞Java开发
的, 没有大厂经验. 2020
自己也马上快3年工作经验
了. 如果再不找找机会进大厂深造一下, 后面的竞争力和个人的提升将会更难.因此在现在公司磨砺了两年之后, 开始向大厂迈进~ 这篇博客主要是想分享一下自己在面试过程中所遇到的问题,相对比较坎坷,前后经历了3个多月
.希望大家也能在找工作的过程中,坚持下来!
2、面试结果
阿里-蚂蚁支付宝
P6 offer腾讯-pcg
2-3 offer字节
2面 后放弃
3、面试过程
3.1、阿里-天猫超市
一面
1、静态代理,动态代理
简单描述区别, 然后可以引出 jdk动态代理
和cglib
的底层实现原理(Proxy
和 InvocationHandler
).
再引入 Spring AOP
在不同情况下采用的代理实现方式
最后举例项目中动态代理的使用场景(常见的 日志打印
)
2、future (重点)
Future
用来代表异步的结果.可以引出 ExecutorService.submit
和 ExecutorService.execute
的区别
如果有研究过一些框架的源码, 可以说一下 Future
在其中起的作用(超时控制)
3、线程池实现方式-销毁线程
这里支持需要指出 Executors
和 ThreadPoolExecutor
之间的关系
通过设置不同的入参,实现不同的线程池. 比较有意思的 SynchronousQueue
实现原理可以深入学习一下
线程池回收: 传送门
4、mysql 联合索引
先介绍一下什么是 联合索引
, 索引使用场景和失效情况, 如果了解 索引下推
可以说一下
引出 联合索引
和 主键索引
有什么区别. 然后可以深入对比一下 Innodb
和 MYISAM
的区别
点睛之笔 : 自己去写几条sql 查看索引的选择规则, 你会发现并不是建立了索引就会走, 也并不是有索引下推就一定会去采用, 这就可以涉及到 mysql 一条sql 的执行过程
5、redis 集群
主要的几种集群: 主从
,哨兵
和redis Cluster
这几种服务端集群. 类似 Twemproxy
和 Codis
这种代理实现,如果了解可以说一下.
细问: 当前公司采用哪种方案(哨兵),为什么(数据量较少,主从+哨兵能支撑业务场景),介绍哨兵的工作原理.
当时问了一个问题: 如果主挂了之后,选主结束后,怎么去通知客户端. 客户端和哨兵是什么样的关系(有无关联)
6、mysql 分库分表
先问: 目前数据库的容量大概是多少,有没有做分库分表设计.
答曰: 目前单表数据量在5000w
左右, 日增长在10w以内
, 暂时没有这方面的考虑(劣大于优).
再引出: 分库分表有哪些方式(垂直分库
, 垂直/水平分表
),讲解一下区别. 可以再说一下 分布式自增id
的实现方案,常见的比如 雪花算法
, 美团-Leaf
7、项目内容
1 | 复制代码项目介绍,主要是挖掘你在工作中的思考以及亮点. 后面统一介绍, 因为每轮面试基本都会说一次 |
二面
1 | 复制代码二面流程比较快, 没有什么特点 |
- 介绍项目和当前公司的盈利模式
- 项目遇到最大的困难
- 项目的方案设计等
总共20多分钟, 感觉应该没什么大问题.
结果
为啥那么快到结果呢, 就是凉了~
面试完没几天, 跟二面面试官沟通, 是通过
了, 还让我准备一下后续的笔试
可能是表现稍差,对比被 干掉 或者 没hc
了
3.2 腾讯TEG
一面
HashMap 底层实现
介绍基本结构,对比 1.7和1.8的区别
建议深入阅读 1.8 resize()
的源码, 还有红黑素转换的过程
HashMap 是否线程安全,如果需要使用线程安全的呢
对比 HashMap
,HashTable
和 CurrentHashMap
的区别和使用场景
给出一 个HashMap
要在线程安全
的情况下使用, 通过加锁
和 Collections.SynchronizedMap
对当前 HashMap
进行封装
介绍一下红黑树
原理: 红黑树传送门
应用场景: JDK1.8 HashMap
, 对比 B+树
和 跳跃表
redis 速度快是因为什么原因
- 内存
- 单线程
- 数据结构
- io多路服复用
性能瓶颈(内存
,网络io
), 可以指出 为解决 网络IO
的瓶颈,在 redis 6.0
提出的 单主线程,多工作线程的设计.可以对比 Memecached 的多线程模型进行对比.
mysql 索引介绍
- 聚集索引和非聚索引的区别(InnoDb 和 MyISAM 对比)
- 索引选择(优化器怎么选择索引)
- 索引失效
- 索引下推
为什么选择b+树
介绍 b+树和b树的区别, 对比b+树在磁盘IO上面的优势(单页能存更多的索引),可以提一下mongodb 采用的是B树索引 .
可以参考: 为什么 MongoDB 索引选择B树,而 Mysql 选择B+树
聚集索引和非聚集索引
参考: 聚集索引和非聚集索引 简析与对比
当时踩了个坑, 聚集索引
和聚簇索引
其实是一个东西
默认主键索引
如果没有设置主键索引, innodb
会默认添加一个隐藏列作为主键索引
为什么需要这个隐藏列, 可以参考innodb
的数据存储结构
如何设计主键索引: MySQL主键设计
虚拟内存和物理内存
参考: 虚拟内存和物理内存的理解
简而言之:
1 | 复制代码物理内存有限, 虚拟内存通过磁盘映射的形式进行分配物理内存 |
伪共享
可以结合 volatile
和 ConcurrenthashMap.countercell
进行解答
TCP如何确保可靠传输
- 数据包校验
- 重排序
- 丢弃重复数据
- 应答机制
- 超时重传
- 流量控制
拥塞控制
- 慢开始。
- 拥塞避免。
- 快重传。
- 快恢复
1 | 复制代码计算机网络这部分的内容相对来说比较考验背诵理解. |
项目设计
1 | 复制代码后续补充 |
kafka /es 有没有使用过
有没有了解最新版本的redis(支持多线程)
笔试题
笔试题的内容比较多, 有编程题
,算法题
和程序运行结果的选择题
等
二面
项目遇到最大的问题(OOM) - 会比较长
个人的分析步骤, 感兴趣可以参考一下. 主要也是根据理论基础进行分析, 然后一步步排查.
1 | 复制代码1、jvm oom排查 (Java heap space) |
为什么要使用 redis
引入中间件都是为了解决目前存在的问题. 比如 数据库访问压力比较大, 数据存储变化频繁,数据访问频率高和数据时效性低等.
可以进一步说明,引入redis 带来的问题 和如何解决的. 比如: 引入了 redis 如何确保数据一致, redis 不可用如何保证服务可用.
改善后的吞吐量,数据库的qps
这里考验的是数据敏感性, 每次改动之后要求对系统进行测评. 判断这次修改是否对服务性能进行了提升,提升了多少, 哪里还有瓶颈等
数据库的事务, innodb 的索引实现原理
事务隔离级别 和 如何实现的.
如何实现这一块需要去了解一下 mvcc
io多路复用
select
、poll
和epoll
对比
有遇到深入问 epoll
事件通知是如何实现的.
推荐: Linux IO模式及 select、poll、epoll详解
性能瓶颈,如何再优化
主要围绕这三个点进行分析:
- cpu
- 内存
- io
rpc 调用过程, (为什么看dubbo源码)
rpc 调用过程这个问的挺多的, 可以参考 dubbo 的架构设计, 然后一步步跟着源码走一遍就理解了.
为什么看: 提高自己的编码能力和设计能力 (要带着问题去看源码, 不然很容易忘记)
小组内的工作职责
三面
工作内容
- 版本开发
- 问题处理
- 需求分配
- 技术评审
重构(思路,实现)
建议阅读: 《重构-改善既有代码的设计》
性能优化做了什么
jvm 调优
,sql 优化/重建索引
和 MQ 解耦
同步和异步的区别
Linux io多路复用/aio
参考上述 面试二
linux select 通知
B+树和红黑树
HashMap 红黑树
进程间通信的方式
- 管道
- 匿名管道
- 信号
- 信号量
- 消息队列
- 共享内存
- 套接字
系统性能瓶颈
主要围绕这三个点进行分析:
- cpu
- 内存
- io
结果
TEG
这边的面试, 也是N
了
3.3 腾讯PCG
一面
rocketmq 如何保证消息可靠
从生产, MQ 和消费三端进行分析
消息队列技术选型
对比常见的 RabbitMQ
,RockerMQ
和 Kafka
技术特点, 结合公司的实际场景抉择。
rocketmq half message
介绍 half message
,失败如何回调等
rocketmq 消费失败
如何解决消费失败的问题,和消费失败可能导致的 n+1
问题
dubbo 通信过程
rpc
调用过程
dubbo 本地缓存地址
dubbo
底层源码
redis 集群模式
redis 主从同步
spring 事务传播机制
mysql 隔离级别
redis 跳跃表 层数的设置
上述可能有比较多重复的内容, 因此没有再做详细的介绍了, 大家可以自行再去学习一下~
二面
1 | 复制代码二面的过程有点像聊天,面试官跟 我前面别的部门(不是上面的TEG)的面试官认识,因此了解我的整体情况。 |
三面
项目介绍
1 | 复制代码项目介绍主要从: |
1、业务场景
博主这边做的项目是一个教育行业的系统, 主要是描述了一下 学生在线答题的业务场景。各位可以根据自己的项目进行梳理。
2、性能数据
性能数据这一块应该是社招比较看重的问题, 基本每一轮面试都会有面试官问 性能怎么样, 需要我们平时对自己系统有一定的了解,并且清楚实际数据怎么样。 具体包括: 每天访问量
,服务 qps/tps
,用户量和机器数量(机器配置)等多方面的数据。
3、问题难点
这里我主要将两个地方吧, 一个是上面说到的 oom 问题定位处理 , 一个是 RocketMQ 解耦。
上面介绍了 oom, 下面简单介绍一下结合项目引入 RocketMQ。
1 | 复制代码1、为什么引入RocketMQ |
4、问题难点
cpu,内存和IO 三方面进行分析吧, 具体系统具体分析。应该没有啥系统是没有瓶颈的。
hr面
工作内容
团队身份
学习规划
职业规划
个人绩效
offer
千辛万苦,终获腾讯offer,上面虽然只写了两个部门的面试内容,但是我至少面了4个部门了(2个月内),所以,没什么岁月安好,只有负重前行,才能实现梦想。
3.3 阿里蚂蚁
一面
1、匿名类,内部类静态内部类
2、HashMap 1.7和1.8区别
3、BlockingQueue 相关知识
4、线程池的创建形式,使用场景
5、多线程下实现一个计数器
6、wait 和notify
7、B+树和红黑树
8、数据库的隔离级别
9、数据库如何解决幻读
10、mysql 索引
11、redis 分布式锁
12、redis 哨兵集群
13、rpc 调用过程
14、zookeeper 是怎么服务发现的
15、zookeeper 心跳检测
总体来说,跟上面的面试过程也是大体上面相似,也没有什么难点的。因此也不做详细分析了~
二面
二面进行的也是比较快,主要是两个问题吧
项目介绍
也是跟上面的差不多内容
场景题
用户的资源权限数据库设计
三面
三面面试官问题主要是跟业务场景和架构方面的, 整体跟腾讯的三面差不多(实际上是因为忘记了问了啥, 主要也是跟项目相关的)
四面
整个流程下来大概10分钟左右,当时刚面完头条,有点突然。
项目难点
问题处理
团队角色
学习方法
hr面
hr面一共面了10分钟左右,当时面完也是慌的一批,咋那么快呢。
问的问题主要就是:
离职原因
职业规划
薪资水平
offer
最后也是成功拿到了ali 的offer ,完成自己的理想了吧! 以后便以 九灵
行走江湖了~~
4、总结与建议
楼主在面试过程中也不是一帆风顺,也是披荆斩棘走过来的,2020
不是一个安稳的时间, 每天在发生在各种各样的变化。只有坚持
,把握
,不放弃
方能达到自己的目标。
加油吧,少年!
最后贴一个新生的公众号 (Java 补习课
),欢迎各位关注,主要会分享一下面试的内容(参考之前博主的文章),阿里的开源技术之类和阿里生活相关。 想要交流面试经验的,可以添加我的个人微信(Jayce-K
)进群学习~
本文转载自: 掘金