一、一面 8.27(约 60 min,电话)
1.做过的印象最深的项目?(聊项目)
2.MySQL 的 log 有哪些?分别是用来做什么的?(undo log,redo log,binlog)
重做日志(redo log):确保事务的持久性。redo日志记录事务执行后的状态,用来恢复未写入data file的已成功事务更新的数据。防止在发生故障的时间点,尚有脏页未写入磁盘,在重启mysql服务的时候,根据redo log进行重做,从而达到事务的持久性这一特性。
回滚日志(undo log):保证数据的原子性,保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读
二进制日志(binlog):用于复制,在主从复制中,从库利用主库上的binlog进行重播,实现主从同步.
3.数据库分表分库?(没实践过,扯了点水平分表和垂直分表的理论)分库分表的全局唯一 ID怎么实现?
垂直分库就是根据业务耦合性,将关联度低的不同表存储在不同的数据库。做法与大系统拆分为多个小系统类似,按业务分类进行独立划分。与"微服务治理"的做法相似,每个微服务使用单独的一个数据库
垂直分表是基于数据库中的"列"进行,某个表字段较多,可以新建一张扩展表,将不经常用或字段长度较大的字段拆分出去到扩展表中。 MySQL底层是通过数据页存储的,一条记录占用空间过大会导致跨页,造成额外的性能开销。另外数据库以行为单位将数据加载到内存中,这样表中字段长度较短且访问频率较高,内存能加载更多的数据,命中率更高,减少了磁盘IO,从而提升了数据库性能
雪花算法 生成64位的Long型数字
第一位未使用
接下来41位是毫秒级时间,41位的长度可以表示69年的时间
5位datacenterId,5位workerId。10位的长度最多支持部署1024个节点
最后12位是毫秒内的计数,12位的计数顺序号支持每个节点每毫秒产生4096个ID序列
4.数据库 ACID? 简单
5.数据库事务的隔离级别? 简单
6.慢查询的优化思路?简单
7.你做过那个项目之后,在数据库这块有怎样的提升?(扯了点外键约束相关)
8.Java HashMap 的 put 操作底层是怎么实现的? 简单
9.线程池的构造器的参数介绍一下? 简单
10.Lock 和 synchronized 的区别? 简单
11.AtomicLong 类的底层实现原理
AtomicLong是作用是对长整形进行原子操作。
在32位操作系统中,64位的long 和 double 变量由于会被JVM当作两个分离的32位来进行操作,所以不具有原子性。而使用AtomicLong能让long的操作保持原子型。
12.线程的状态? 简单
13.实际使用过多线程吗?(没有……)
14.什么情况下会发生死锁? 简单
15.JVM 内存的划分? 简单
16.Java 堆的划分? 简单
17.为什么要分代? 简单
18.垃圾收集器了解哪些? 简单
19.哪些对象会被 JVM 垃圾回收? 简单
20.GC ROOTS 包括哪些?
我的理解是:无论是引用计数器算法还是可达性算法,都重点关注的是“引用”,引用通俗的说是指向另一块内存的地址。所说的四种GCroot对象的引用,分别存在于虚拟机栈、本地方法栈和方法区中。楼主所说的对象的属性本深就在对象的“实例数据”中,让它作为GCroot,无法解决互相依赖的问题。
21.OOM 排查?(不知道……)
22.Java 怎么利用反射获取一个类的字段?
getFields():获得某个类的所有的公共(public)的字段,包括父类中的字段。
String fieldName = field.getName(); 获取字段的名称
Field[] fields = User.class.getDeclaredFields(); 获取所有
23.常见的类加载器? 简单
24.看过哪些框架的源码?
25.Spring @Autowired / @Resource 的区别?
@Resource和@Autowired注解都是用来实现依赖注入的。只是@AutoWried按byType自动注入,而@Resource默认按byName自动注入。
26.Spring 依赖注入的原理
Spring的依赖注入依靠了动态代理和反射,发现Spring获取Bean 最后几乎都是从map中拿值,就想到了 Spring可能是在启动时就将实例对象缓存,之后都是不断的复用。
27.Spring bean 的作用域有哪些
singleton和prototype,前者表示Bean以单例的方式存在;后者表示每次从容器中调用Bean时,都会返回一个新的实例,prototype通常翻译为原型
28.session 和 cookie 的区别? 简单
29.如何识别 session? 简单
(存在 cookie 里面的 session id)
30.HTTP 报文结构
31.HTTP 状态码
200 - 请求成功
301 - 资源(网页等)被永久转移到其它URL
404 - 请求的资源(网页等)不存在
500 - 内部服务器错误
32.Java IO 模型有哪几种? 简单
33.同步 / 异步,阻塞 / 非阻塞的区别? 简单
34.Netty 了解吗?(不了解……)
35.说几个设计模式?Spring 里面使用到了哪些设计模式? 简单
36.Java 如何实现单例? 简单
37.CAP 理论?
CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾
38.分布式事务有哪些实现方式?
2PC两阶段提交协议
2PC是非常经典的强一致、中心化的原子提交协议,协议中定义了两类节点:一个中心化协调者节点和多个参与者节点。2PC分为两个阶段:
准备阶段:
1、协调者向所有参与者发送事务内容,询问是否可以提交事务,并等待所有参与者答复。
2、各参与者执行事务操作,将Undo和Redo信息记入事务日志中(但不提交事务)。
3、如参与者执行成功,给协调者反馈YES,即可以提交;如执行失败,给协调者反馈NO,即不可提交。
提交阶段:
(所有参与者均反馈YES)
1、协调者向所有参与者发出正式提交事务的请求(即Commit请求)。
2、参与者执行Commit请求,并释放整个事务期间占用的资源。
3、各参与者向协调者反馈Ack完成的消息。
4、协调者收到所有参与者反馈的Ack消息后,即完成事务提交。
(任何一个参与者反馈NO)
1、协调者向所有参与者发出回滚请求(即Rollback请求)。
2、参与者使用阶段1中的Undo信息执行回滚操作,并释放整个事务期间占用的资源。
3、各参与者向协调者反馈Ack完成的消息。
4、协调者收到所有参与者反馈的Ack消息后,即完成事务中断。
39.微服务的架构设计是怎样的?
40.网络安全?(随便扯了点被动攻击、主动攻击之类的,这方面懂得不多)
41.Redis 数据类型有哪些? 简单
42.未来的发展方向是怎么考虑的?
43.平时会写文章 / 博客吗? 会
44.有做过其他项目吗?
45.反问环节
知识储备有哪些地方需要补全的?
二、二面 9.3(约 50 min,电话)
二面之前的一天面试官先联系了我,出了一道题目,让我实现一个 Linux Shell 脚本的功能,然后把代码发给他。
//评测题目: 请用java实现以下shell脚本的功能 uniq -c 记录重复次数 cat /home/admin/logs/biz.log | grep "Login" | uniq -c | sort -nr 假设biz.log内容如下: User11 Login User22 Login User11 Login User11 22 LogOff 则输出: User11 Login:2 User22 Login:1 实际上这里有个坑,如果按这条 Shell 命令去执行,得到的结果应当是(CentOS 7): 1 User22 Login 1 User11 Login 1 User11 Login `原因就在于 uniq 命令是对连续出现的文本进行去重,这里两个 User11 Login 不连续,因此不会被去重。 这个坑导致面试一开始的氛围比较尴尬
1.讨论这个题,面试官一直强调我的代码没有实现它给出的示例输出(明明是你的题目有坑……)。我跟他说如果把 sort 和 uniq 换个位置就能得到它的示例输出。结果面试官说:“你知道这个题是错的,你还往这个错误的方向去实现。”(WTF?这就是阿里味儿吗?i 了 i 了)
2.你做这个题有挑战吗?(反正是开卷做题……谈不上有什么挑战)
3.文件的日志行数是百万/千万级别,还有没有挑战?挑战在什么地方?(生成结果的速度,大文件排序的处理)针对这个数量级怎样去修改算法(多线程 fork-join,join 的时候会遇到什么问题?)
4.你自己写代码会考虑内存占用或者计算资源分配的问题吗?(不会……)
5.线上排查过 JVM 故障吗?看过这方面文章吗?(没有……)
6.数据库了解哪些?
7.提高慢查询性能有哪些方法?
8.看过开源代码吗?
9.看源码有什么收获?(
10.那你为什么说你读的源码不多?(
11.后面的职业发展怎么考虑的?
12.为什么想搞中间件?如果你要搞这个方向,你觉得你应该要学习什么东西?
13.学技术这么久,有没有什么事情让你觉得很自豪?
14.有写过博客或者文章吗?
15.跨专业的跨度大吗?为什么要转行?
16.在项目里的分工和职责?
17.实习期间接触到的技术栈?
18.你的技术亮点是什么?
19.技术之外的方面有什么特长?