985毕业一年,腾讯一面追魂50问,虐的我完无体肤,总结失败备战腾讯!

背景

985毕业至今恰好一年,我曾作过两三个月的测试感受不是很合适,后面选择从过后端开发,还挺香。如今已经进入秋招的提早批了,想着去大厂试试水,就去了腾讯,整个一面下来我整我的都傻了,表示怀疑人生...没想过一面就能问这么多,疯狂轰炸,连环50问,不得停歇。感受我这辈子都不会忘记此次面试经历了,给你们看看个人面试过程,我想,恐怕你也会表示同感。node

985毕业工做一年,腾讯试水一面连环50问,瞬间表示怀疑人生了.

 

注意:这次面试采用的是电话面试,我会复述所有的面试过程以及我的的回答状况和反思与总结,而且会分享个人面试学习的刷题笔记,有须要的能够点击便可免费获取面试资料 面试答案给你分享哦~mysql

个人面试过程(历经70mins)

一、我的履历简述面试

二、项目简述redis

  • 主要突出重难点,我bb了一堆业务逻辑结果人家都不感兴趣

三、SpringAOP实现sql

  • JDK动态代理:实现Invocationhandler接口,本质上是new一个继承了全部类上Interface的Proxy对象,而后经过method.invoke进行调用
  • CGLib动态代理:在内存中动态生成子类对原对象进行代理,没法代理final类以及方法
  • 共同限制:没法代理到当前class当中this引用的嵌套方法

四、AOP用的哪一种?数据库

  • 默认用的JDK动态代理

五、JDK动态代理以及CGLib动态代理性能比较编程

  • JDK走的反射,会多一些反射调用的开销(方法权限验证、调用开销等)
  • CGLib须要建立新对象,在建立新对象上,即初始化时会多一些开销

六、Java的线程池用过吗,具体参数讲一下后端

Java的线程池是一个三级存储结构,线程先放入核心线程池,满了以后放到缓存队列当中,最后若是缓存队列也满了则扩容新线程,因此参数有:设计模式

  • 核心线程数量
  • 缓存队列类型
  • 最大线程数量
  • 线程活跃时间
  • 线程工厂方法(写日志、重命名线程等)

七、线程池的Execute和Submit区别缓存

  • Execute执行runnable,Submit能够执行Future,咱们通常用countDownLatch+Future来获取全部的线程结果

八、继续问,还有别的区别吗?

  • 不知道了,后续查了发现区别以下
  • Execute会在运行期直接抛出异常,Submit以后在调用Future.get的时候才会抛出异常

九、线程池如何保证当前线程获取池内的worker的时候不产生争用

  • volatile的state标志这个worker有没有被使用

十、volatile的特性

  • 经过禁止指令重排序来保证内存可见性,实际使用内存屏障实现的

十一、内存屏障分几种?

当时记不得了,回头查了一下以下:

  • LoadLoad屏障:对于这样的语句Load1; LoadLoad; Load2,在Load2及后续读取操做要读取的数据被访问前,保证Load1要读取的数据被读取完毕。
  • StoreStore屏障:对于这样的语句Store1; StoreStore; Store2,在Store2及后续写入操做执行前,保证Store1的写入操做对其它处理器可见。
  • LoadStore屏障:对于这样的语句Load1; LoadStore; Store2,在Store2及后续写入操做被刷出前,保证Load1要读取的数据被读取完毕。
  • StoreLoad屏障:对于这样的语句Store1; StoreLoad; Load2,在Load2及后续全部读取操做执行前,保证Store1的写入对全部处理器可见。它的开销是四种屏障中最大的。在大多数处理器的实现中,这个屏障是个万能屏障,兼具其它三种内存屏障的功能。

十二、除了在volatile当中使用了内存屏障,JAVA还有哪里使用了内存屏障

  • 这个真不知道,知道的小伙伴请在评论区指点一二

1三、你以前讲到了CountDownLatch,你知道它的内部实现吗

  • 知道,用的AQS,在state=0的时候才容许全部等待的线程所有经过

1四、简单讲一下AQS

AQS核心设计:

  • 一个volatile int state的状态值,使用volatile保证线程可见性,使用int来提供可重入的多资源能力
  • 双向队列,首节点为执行节点,能够根据执行节点的Node信息判断是ShareLock仍是ExclusiveLock,会关联一个执行线程,来提供可重入的判断
  • 加锁的时候如果公平锁则尝试CAS载入队列,如果非公平锁则直接入队列
  • 解锁的时候直接唤醒后继的第一个wait节点

1五、加锁以后AQS是如何响应中断的?

  • 太细节了真不会,以前复习源码没看这么深(结束以后补漏洞)

1六、OK问点别的,AQS存在什么实现呢?

  • 用过的ReentranceLock、CountDownLatch

1七、讲讲实现

  • ReentranceLock经过判断线程是否相同进行冲入
  • CountDownLatch在state为0的时候才让全部的await经过

1八、据说过ReadWriteLock吗,你以前提到AQS当中只有一个State那你如何用一个State去支撑读写两种状态

  • 一个state是Int,能够分高位给Read,低位给Write,就当个String用了

1九、Int几个字节

  • 我竟然回答了32个,应该是32位,8位一个byte,共计四个byte

20、大家用过缓存吗

  • 没有,可是用redis作了分布式锁

2一、你说说下分布式锁怎么作的?

  • 分布式锁也是一个锁,须要知足几个特性,1 可重入 2 能够识别加锁的身份防止ABA问题 3 考虑是否须要续约
  • key是所须要加上的锁的业务资源惟一编码,value是当前线程的uuid,uuid存在threadLocal内 加锁的时候用的jedis,先设一个过时时间,而后用ex,若不存在key则添加新key,若已经存在则直接失败
  • 解锁用的阿里云企业版的CAD(compareAndDelete),原子比较并解锁,本质是经过lua脚本进行的相似事务操做

2二、除了redis还有什么能够作分布式锁?

  • Mysql、zookeeper等

2三、若是让你用Mysql作分布式锁你怎么作

  • 新建一张表,主键为须要锁的锁key,col1为线程uuid,col2为ttl时间
  • 加锁的时候在一个事务中选取当前key的record,若存在则判断ttl,若不存在则直接能够插入
  • 解锁的时候直接把record删除便可
  • 起一个定时任务来遍历表,清楚过时键防止无限膨胀

2四、zookeeper了解吗

  • 一点点,摄入不深

2五、那咱们继续聊聊Redis吧,Redis有什么数据结构?

  • List,Hash,Set,Zset,List

2六、Zset怎么实现的?

  • 跳表+map实现

2七、什么是跳表?

  • 常规链表只有一个next节点,跳表持有多个指向其余链表的指针,能够跨越式的进行查找,时间复杂度是logn

2八、若是我要找一个score为A的节点应该如何去找?

  • 首先在map中找到对应的node排名,而后根据排名在skiplist中进行查找

2九、zrange是如何实现的?

  • 这个没想到不该该,查了一下以下: ZRANGE key start stop [WITHSCORES],zrange 就是返回有序集 key 中,指定区间内的成员,而跳表中的元素最下面的一层是有序的(上面的几层就是跳表的索引),按照分数排序,咱们只要找出 start 表明的元素,而后向前或者向后遍历 M 次拉出全部数据便可,而找出 start 表明的元素,其实就是在跳表中找一个元素的时间复杂度。跳表中每一个节点每一层都会保存到下一个节点的跨度,在寻找过程当中能够根据跨度和来求当前的排名,因此查找过程是 O(log(N) 过程,加上遍历 M 个元素,就是 O(log(N)+M),因此 redis 的 zrange 不会像 mysql 的 offset 有比较严重的性能问题。

30、Redis持久化

  • RDB:快照存储,能够选择是否阻塞,使用场景在数据库上下线、主备复制等状况中
  • AOF:相似于binlog,每一个里面都是一个写事件,是优先读取的策略,支持多策略写入(强同步、按时间刷盘、交由操做系统决定刷盘等),AOF为了防止文件膨胀也支持重写

3一、AOF重写的时候会不会block主线程?

  • 不会,没有这个必要,起一个子线程重写完毕以后把手头的buffer在刷进去就好了

3二、在载入的时候是怎么作的

  • 本地起一个client直接读取AOF重放其中的命令

3三、Redis有哪些多机部署方案?

  • 经典的主备同步,经过RDB初始化备库而后进行命令传播 Sentinel,其实是一种容灾机制 cluster,集群部署,使用多机占用slot的方式进行集群服务提供

3四、在主备环境下,若是一个备库中途断链了,从新上线的时候怎么执行同步?

  • 主备各自维护一个写入的Offset,对比差别以后在buffer中读出丢失的命令并进行同步

3五、若是备库的offset过于落后已经不在buffer当中了呢?

  • 直接RDB从新同步 使用AOF来查找对应offset的语句(这个是我猜的)

3六、cluster如何作的故障转移?

  • 不知道,估计也是检测到客观下线而后paxos选主

3七、Mysql了解吗,里面有哪些锁?

  • 类型分类:共享锁(S),独占锁(X),意向锁(与表锁互斥)
  • 粒度分类:行锁、表锁

3八、行锁怎么实现的?

  • 不知道,这个时候已经有点崩溃了,怎么这么多不知道nnd

3九、讲一下事务隔离级别吧

  • RU、RC、RR、Serializable

40、大家用的是哪一个隔离级别

  • mysql默认的是RR,咱们改为RC了

4一、在默认隔离级别下会产生幻读问题吗?

  • 会,这是幻读是RR的经典问题之一

4二、描述一下幻读

  • 在T1里Select * From table where id = 1;若不存在该记录则insert id = 1的记录进去,可是在select完毕以后T2事务插入了id=1的record,此时后续insert执行失败,本质上来说是当前的快照都不支持后续dml语句的执行

4三、MVCC机制了解吗?

  • 了解,由undolog支撑的数据隔离机制,主要是为了提供更高的并发度

4四、讲一下原理

  • 每一行record都存在两个隐藏行,一个是当前的事务id,一个是指向undolog的指针 mvcc机制运行
  • 在rr和rc两个隔离级别下 在每次生成ReadView的时候,会将当前的活跃事务ID维护在列表当中,若是访问的Record的ID比最小活跃事务的ID还要小说明以前已经提交了,能够直接读取,若是与最大事务ID还要大就证实该事务在这个快照时没提交,须要根据undolog去找对应的历史版本,若是在最大和最小之间,那么若其为活跃事务则找历史版本,若不是则直接读取
  • 在RC级别下,每次Select都生成新的ReadView,因此能看到不一样事物间的提交
  • 在RR级别下,只在第一次Select的时候生成ReadView,因此会产生幻读,由于快照读和真实读的结果不一致

4五、慢sql怎么处理?

  • 捞慢sql日志先分析写的索引是否是有问题或者offset太大了,而后看expain

4六、你关注explain的那些col?

  • key:真实用到的索引
  • possible_key:可能用的索引
  • rows:扫描行数,越大越拉垮
  • filter:过滤数据比例,这个col能够验证索引有效性
  • extra:包含是否使用索引、sort是否时filesort等

4七、https了解吗?

  • client发一个随机数给server
  • server发证书+随机数回来
  • client拆证书找第三方验证证书有效性,取出公钥
  • client拿公钥加密第三个随机数发server
  • server私钥解密

4八、线上机器cpu100%你怎么处理?

  • 容器化时代,必定要top看下是否是st太高,存在超卖的可能性
  • 若是不是的话top看下哪一个进程有问题,而后看这个进程哪一个线程吃了cpu
  • jstack直接把线程dump出来而后找对应有问题的线程再分析
  • 也有多是内存泄漏致使的频繁GC问题,能够拉GClog而后在jmap把heap dump出来看下

4九、大家线上JVM通常调整什么参数?

  • XMX&XMS固定防止内存抖动
  • 堆空间调整:年轻代Age调整、年轻代eden:s0:s1比例调整
  • 收集器调整:大促前把CMS的预清理次数调低一些,CMS的清理阈值调高一些

50、反问

  • 什么团队?
  • 作什么业务的?

自我反思

985毕业工做一年,腾讯试水一面连环50问,瞬间表示怀疑人生了.

 

虽然说此次是抱着试水的心态去的,可是这一连50问着实是有点傻眼了,并且也发现了本身的不少漏洞,以下:

  • 个人简历过长,难以被面试官抓住重点
  • 项目使用技术栈没有体现出来
  • 涉及相关项目重难点表述不是很清楚,分布式锁、多租户的分库分表以及中间件隔离方案、性能问题排查等
  • 各种技术栈停其实都还留在使用层,没有深刻去挖掘
  • 语速太快了,70分钟的面试大大小小回答了50个问题,我感受放慢点够我回答两轮了

最后总结我的所得(供你们参考学习)

此次一面结束以后我反思好久,发现本身真的是有不少不足和漏洞,因此最近一直在规划本身的学习路线去不足,不论你是复习备战面试仍是本身学习,我相信我所说的多少仍是有点用处的。

1.1 首先,第一个应该去梳理整个体系的知识大纲

985毕业工做一年,腾讯试水一面连环50问,瞬间表示怀疑人生了.

整个体系的知识大纲

我将整个体系分为5个专题:并发编程、性能调优、Spring全家桶、缓存数据库、分布式&微服务

1.2 其次,根据上面的分类,按照大纲来学习(最后看面试专题)

对于每个专题,去搜集相应的面试学习笔记,好比下面我所收集的(如果对我收集的这份知识体系大纲以及下方每一个专题对应的面试+学习笔记感兴趣,小编能够免费分享给你一块儿学习,转发一下下而后点击便可免费获取面试资料 面试答案便可回复你哦)

1. 并发编程(手写笔记:并发编程+并发编程_原理+并发编程_应用+并发编程_模式)

  • 并发编程

985毕业工做一年,腾讯试水一面连环50问,瞬间表示怀疑人生了.

并发编程

  • 并发编程_原理

985毕业工做一年,腾讯试水一面连环50问,瞬间表示怀疑人生了.

并发编程_原理

  • 并发编程_应用

985毕业工做一年,腾讯试水一面连环50问,瞬间表示怀疑人生了.

并发编程_应用

  • 并发编程_模式

985毕业工做一年,腾讯试水一面连环50问,瞬间表示怀疑人生了.

并发编程_模式

  1. 性能调优(Java性能调优实战:Java编程性能调优+多线程性能调优+JVM性能监测及调优+设计模式调优+数据库性能调优+实战演练

985毕业工做一年,腾讯试水一面连环50问,瞬间表示怀疑人生了.

性能调优

  1. Spring全家桶(关注这一部分,我将Spring、MVC、Cloud、Boot归整在一块了)
  • 手绘的各思惟脑图(帮助梳理知识点,比较多就不一一截图了)

985毕业工做一年,腾讯试水一面连环50问,瞬间表示怀疑人生了.

Spring全家桶手绘的各思惟脑图

  • 进阶学习的笔记

985毕业工做一年,腾讯试水一面连环50问,瞬间表示怀疑人生了.

Spring全家桶进阶学习的笔记

  1. 缓存数据库(主要是MySQL+Redis+MongDB)

985毕业工做一年,腾讯试水一面连环50问,瞬间表示怀疑人生了.

MySQL+Redis+MongDB

  1. 分布式&微服务(整理的笔记以下)

985毕业工做一年,腾讯试水一面连环50问,瞬间表示怀疑人生了.

分布式&微服务

1.3 最后来看面试专题

我从基础-中级-高级开始一步一步逐步深刻,这些面试问题同样都有分类整理,点击便可免费获取面试资料 面试答案给你分享喔(附答案解析)。

  • 好比基础部分:

985毕业工做一年,腾讯试水一面连环50问,瞬间表示怀疑人生了.

基础部分

  • 中级部分:

985毕业工做一年,腾讯试水一面连环50问,瞬间表示怀疑人生了.

中级部分

  • 高级部分(消息队列+Redis缓存+分库分表+读写分离+分布式系统+高可用+微服务架构)

985毕业工做一年,腾讯试水一面连环50问,瞬间表示怀疑人生了.

高级部分

以上就是我所有的一个学习路线的规划了,从总体的一个知识体系出发,梳理所有的知识,有漏洞就去查阅我相关的手写笔记加以巩固,最后上面试刷题,争取查漏补缺,下次面试再也不出现这么多的不知道和知识空白。

话说到这里,不管是知识体系大纲,仍是相关的并发编程、性能调优、Spring全家桶、缓存数据库、分布式&微服务等等的笔记,如何你也想学习或者复习一下,那即可直接来找小编分享就行

只是麻烦你们帮忙转发一下(能够帮助更多有须要的人看见),点击便可免费获取面试资料 面试答案,会立马回复给你免费下载所有个人学习+复习+面试笔记的方式,咱们一块儿学习,加油!