985毕业工作一年,腾讯试水一面连环50问,瞬间表示怀疑人生了.
mhr18 2025-05-16 14:50 20 浏览 0 评论
背景
985毕业至今刚好一年,我曾做过两三个月的测试感觉不是很合适,后面选择从事后端开发,还挺香。现在已经进入秋招的提前批了,想着去大厂试试水,就去了腾讯,整个一面下来我整个人都傻了,表示怀疑人生...没想过一面就能问这么多,疯狂轰炸,连环50问,不得停歇。感觉我这辈子都不会忘记这次面试经历了,给大家看看我的面试过程,我想,恐怕你也会表示同感。
注意:此次面试采用的是电话面试,我会复述全部的面试过程以及个人的回答情况和反思与总结,并且会分享我的面试学习的刷题笔记,有需要的可以私信我【学习】给你分享哦~
我的面试过程(历经70mins)
1、个人履历简述
2、项目简述
- 主要突出重难点,我bb了一堆业务逻辑结果人家都不感兴趣
3、SpringAOP实现
- JDK动态代理:实现Invocationhandler接口,本质上是new一个继承了所有类上Interface的Proxy对象,然后通过method.invoke进行调用
- CGLib动态代理:在内存中动态生成子类对原对象进行代理,无法代理final类以及方法
- 共同限制:无法代理到当前class当中this引用的嵌套方法
4、AOP用的哪种?
- 默认用的JDK动态代理
5、JDK动态代理以及CGLib动态代理性能比较
- JDK走的反射,会多一些反射调用的开销(方法权限验证、调用开销等)
- CGLib需要创建新对象,在创建新对象上,即初始化时会多一些开销
6、Java的线程池用过吗,具体参数讲一下
Java的线程池是一个三级存储结构,线程先放入核心线程池,满了之后放到缓存队列当中,最后如果缓存队列也满了则扩容新线程,所以参数有:
- 核心线程数量
- 缓存队列类型
- 最大线程数量
- 线程活跃时间
- 线程工厂方法(写日志、重命名线程等)
7、线程池的Execute和Submit区别
- Execute执行runnable,Submit可以执行Future,我们一般用countDownLatch+Future来获取所有的线程结果
8、继续问,还有别的区别吗?
- 不知道了,后续查了发现区别如下
- Execute会在运行期直接抛出异常,Submit之后在调用Future.get的时候才会抛出异常
9、线程池如何保证当前线程获取池内的worker的时候不产生争用
- volatile的state标志这个worker有没有被使用
10、volatile的特性
- 通过禁止指令重排序来保证内存可见性,实际使用内存屏障实现的
11、内存屏障分几种?
当时记不得了,回头查了一下如下:
- LoadLoad屏障:对于这样的语句Load1; LoadLoad; Load2,在Load2及后续读取操作要读取的数据被访问前,保证Load1要读取的数据被读取完毕。
- StoreStore屏障:对于这样的语句Store1; StoreStore; Store2,在Store2及后续写入操作执行前,保证Store1的写入操作对其它处理器可见。
- LoadStore屏障:对于这样的语句Load1; LoadStore; Store2,在Store2及后续写入操作被刷出前,保证Load1要读取的数据被读取完毕。
- StoreLoad屏障:对于这样的语句Store1; StoreLoad; Load2,在Load2及后续所有读取操作执行前,保证Store1的写入对所有处理器可见。它的开销是四种屏障中最大的。在大多数处理器的实现中,这个屏障是个万能屏障,兼具其它三种内存屏障的功能。
12、除了在volatile当中使用了内存屏障,JAVA还有哪里使用了内存屏障
- 这个真不知道,知道的小伙伴请在评论区指点一二
13、你之前讲到了CountDownLatch,你知道它的内部实现吗
- 知道,用的AQS,在state=0的时候才允许所有等待的线程全部通过
14、简单讲一下AQS
AQS核心设计:
- 一个volatile int state的状态值,使用volatile保证线程可见性,使用int来提供可重入的多资源能力
- 双向队列,首节点为执行节点,可以根据执行节点的Node信息判断是ShareLock还是ExclusiveLock,会关联一个执行线程,来提供可重入的判断
- 加锁的时候若是公平锁则尝试CAS载入队列,若是非公平锁则直接入队列
- 解锁的时候直接唤醒后继的第一个wait节点
15、加锁之后AQS是如何响应中断的?
- 太细节了真不会,之前复习源码没看这么深(结束之后补漏洞)
16、OK问点别的,AQS存在什么实现呢?
- 用过的ReentranceLock、CountDownLatch
17、讲讲实现
- ReentranceLock通过判断线程是否相同进行冲入
- CountDownLatch在state为0的时候才让所有的await通过
18、听说过ReadWriteLock吗,你之前提到AQS当中只有一个State那你如何用一个State去支撑读写两种状态
- 一个state是Int,可以分高位给Read,低位给Write,就当个String用了
19、Int几个字节
- 我居然回答了32个,应该是32位,8位一个byte,共计四个byte
20、你们用过缓存吗
- 没有,但是用redis做了分布式锁
21、你说说下分布式锁怎么做的?
- 分布式锁也是一个锁,需要满足几个特性,1 可重入 2 可以识别加锁的身份防止ABA问题 3 考虑是否需要续约
- key是所需要加上的锁的业务资源唯一编码,value是当前线程的uuid,uuid存在threadLocal内 加锁的时候用的jedis,先设一个过期时间,然后用ex,若不存在key则添加新key,若已经存在则直接失败
- 解锁用的阿里云企业版的CAD(compareAndDelete),原子比较并解锁,本质是通过lua脚本进行的类似事务操作
22、除了redis还有什么可以做分布式锁?
- Mysql、zookeeper等
23、如果让你用Mysql做分布式锁你怎么做
- 新建一张表,主键为需要锁的锁key,col1为线程uuid,col2为ttl时间
- 加锁的时候在一个事务中选取当前key的record,若存在则判断ttl,若不存在则直接可以插入
- 解锁的时候直接把record删除即可
- 起一个定时任务来遍历表,清楚过期键防止无限膨胀
24、zookeeper了解吗
- 一点点,摄入不深
25、那我们继续聊聊Redis吧,Redis有什么数据结构?
- List,Hash,Set,Zset,List
26、Zset怎么实现的?
- 跳表+map实现
27、什么是跳表?
- 常规链表只有一个next节点,跳表持有多个指向其他链表的指针,可以跨越式的进行查找,时间复杂度是logn
28、如果我要找一个score为A的节点应该如何去找?
- 首先在map中找到对应的node排名,然后根据排名在skiplist中进行查找
29、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为了防止文件膨胀也支持重写
31、AOF重写的时候会不会block主线程?
- 不会,没有这个必要,起一个子线程重写完毕之后把手头的buffer在刷进去就行了
32、在载入的时候是怎么做的
- 本地起一个client直接读取AOF重放其中的命令
33、Redis有哪些多机部署方案?
- 经典的主备同步,通过RDB初始化备库然后进行命令传播 Sentinel,实际上是一种容灾机制 cluster,集群部署,使用多机占用slot的方式进行集群服务提供
34、在主备环境下,如果一个备库中途断链了,重新上线的时候怎么执行同步?
- 主备各自维护一个写入的Offset,对比差异之后在buffer中读出丢失的命令并进行同步
35、如果备库的offset过于落后已经不在buffer当中了呢?
- 直接RDB重新同步 使用AOF来查找对应offset的语句(这个是我猜的)
36、cluster如何做的故障转移?
- 不知道,估计也是检测到客观下线然后paxos选主
37、Mysql了解吗,里面有哪些锁?
- 类型分类:共享锁(S),独占锁(X),意向锁(与表锁互斥)
- 粒度分类:行锁、表锁
38、行锁怎么实现的?
- 不知道,这个时候已经有点崩溃了,怎么这么多不知道nnd
39、讲一下事务隔离级别吧
- RU、RC、RR、Serializable
40、你们用的是哪个隔离级别
- mysql默认的是RR,我们改成RC了
41、在默认隔离级别下会产生幻读问题吗?
- 会,这是幻读是RR的经典问题之一
42、描述一下幻读
- 在T1里Select * From table where id = 1;若不存在该记录则insert id = 1的记录进去,但是在select完毕之后T2事务插入了id=1的record,此时后续insert执行失败,本质上来讲是当前的快照都不支持后续dml语句的执行
43、MVCC机制了解吗?
- 了解,由undolog支撑的数据隔离机制,主要是为了提供更高的并发度
44、讲一下原理
- 每一行record都存在两个隐藏行,一个是当前的事务id,一个是指向undolog的指针 mvcc机制运行
- 在rr和rc两个隔离级别下 在每次生成ReadView的时候,会将当前的活跃事务ID维护在列表当中,如果访问的Record的ID比最小活跃事务的ID还要小说明之前已经提交了,可以直接读取,如果与最大事务ID还要大就证明该事务在这个快照时没提交,需要根据undolog去找对应的历史版本,如果在最大和最小之间,那么若其为活跃事务则找历史版本,若不是则直接读取
- 在RC级别下,每次Select都生成新的ReadView,所以能看到不同事物间的提交
- 在RR级别下,只在第一次Select的时候生成ReadView,所以会产生幻读,因为快照读和真实读的结果不一致
45、慢sql怎么处理?
- 捞慢sql日志先分析写的索引是不是有问题或者offset太大了,然后看expain
46、你关注explain的那些col?
- key:真实用到的索引
- possible_key:可能用的索引
- rows:扫描行数,越大越拉垮
- filter:过滤数据比例,这个col可以验证索引有效性
- extra:包含是否使用索引、sort是否时filesort等
47、https了解吗?
- client发一个随机数给server
- server发证书+随机数回来
- client拆证书找第三方验证证书有效性,取出公钥
- client拿公钥加密第三个随机数发server
- server私钥解密
48、线上机器cpu100%你怎么处理?
- 容器化时代,一定要top看下是不是st过高,存在超卖的可能性
- 如果不是的话top看下哪个进程有问题,然后看这个进程哪个线程吃了cpu
- jstack直接把线程dump出来然后找对应有问题的线程再分析
- 也有可能是内存泄漏导致的频繁GC问题,可以拉GClog然后在jmap把heap dump出来看下
49、你们线上JVM一般调整什么参数?
- XMX&XMS固定防止内存抖动
- 堆空间调整:年轻代Age调整、年轻代eden:s0:s1比例调整
- 收集器调整:大促前把CMS的预清理次数调低一些,CMS的清理阈值调高一些
50、反问
- 什么团队?
- 做什么业务的?
自我反思
虽说这次是抱着试水的心态去的,但是这一连50问着实是有点傻眼了,而且也发现了自己的很多漏洞,如下:
- 我的简历过长,难以被面试官抓住重点
- 项目使用技术栈没有体现出来
- 涉及相关项目重难点表述不是很清楚,分布式锁、多租户的分库分表以及中间件隔离方案、性能问题排查等
- 各类技术栈停其实都还留在使用层,没有深入去挖掘
- 语速太快了,70分钟的面试大大小小回答了50个问题,我感觉放慢点够我回答两轮了
最后总结个人所得(供大家参考学习)
这次一面结束之后我反思很久,发现自己真的是有很多不足和漏洞,所以最近一直在规划自己的学习路线去不足,不论你是复习备战面试还是自己学习,我相信我所说的多少还是有点用处的。
1.1 首先,第一个应该去梳理整个体系的知识大纲
我将整个体系分为5个专题:并发编程、性能调优、Spring全家桶、缓存数据库、分布式&微服务
1.2 其次,根据上面的分类,按照大纲来学习(最后看面试专题)
对于每一个专题,去搜集相应的面试学习笔记,比如下面我所收集的(若是对我收集的这份知识体系大纲以及下方每个专题对应的面试+学习笔记感兴趣,小编可以免费分享给你一起学习,转发一下下然后关注 @追逐仰望星空 私信关键词【学习】即可回复你哦)
1. 并发编程(手写笔记:并发编程+并发编程_原理+并发编程_应用+并发编程_模式)
- 并发编程
- 并发编程_原理
- 并发编程_应用
- 并发编程_模式
- 性能调优(Java性能调优实战:Java编程性能调优+多线程性能调优+JVM性能监测及调优+设计模式调优+数据库性能调优+实战演练)
- Spring全家桶(关注这一部分,我将Spring、MVC、Cloud、Boot归整在一块了)
- 手绘的各思维脑图(帮助梳理知识点,比较多就不一一截图了)
- 进阶学习的笔记
- 缓存数据库(主要是MySQL+Redis+MongDB)
- 分布式&微服务(整理的笔记如下)
1.3 最后来看面试专题
我从基础-中级-高级开始一步一步逐步深入,这些面试问题一样都有分类整理,私信我【学习】给你分享喔(附答案解析)。
- 比如基础部分:
- 中级部分:
- 高级部分(消息队列+Redis缓存+分库分表+读写分离+分布式系统+高可用+微服务架构)
以上就是我全部的一个学习路线的规划了,从整体的一个知识体系出发,梳理全部的知识,有漏洞就去查阅我相关的手写笔记加以巩固,最后上面试刷题,争取查漏补缺,下次面试不再出现这么多的不知道和知识空白。
话说到这里,不论是知识体系大纲,还是相关的并发编程、性能调优、Spring全家桶、缓存数据库、分布式&微服务等等的笔记,如何你也想学习或者复习一下,那便可直接来找小编分享就行。
只是麻烦大家帮忙转发一下(可以帮助更多有需要的人看见),然后私信我【学习】,会立马回复给你免费下载全部我的学习+复习+面试笔记的方式,我们一起学习,加油!
相关推荐
- Java面试宝典之问答系列(java面试回答)
-
以下内容,由兆隆IT云学院就业部根据多年成功就业服务经验提供:1.写出从数据库表Custom中查询No、Name、Num1、Num2并将Name以姓名显示、计算出的和以总和显示的SQL。SELECT...
- ADG (Active Data Guard) 数据容灾架构下,如何配置 Druid 连接池?
-
如上图的数据容灾架构下,上层应用如果使用Druid连接池,应该如何配置,才能在数据库集群节点切换甚至主备数据中心站点切换的情况下,上层应用不需要变动(无需修改配置也无需重启);即数据库节点宕机/...
- SpringBoot多数据源dynamic-datasource快速入门
-
一、简介dynamic-datasourc是一个基于SpringBoot的快速集成多数据源的启动器,其主要特性如下:支持数据源分组,适用于多种场景纯粹多库读写分离一主多从混合模式。支持...
- SpringBoot项目快速开发框架JeecgBoot——项目简介及系统架构!
-
项目简介及系统架构JeecgBoot是一款基于SpringBoot的开发平台,它采用前后端分离架构,集成的框架有SpringBoot2.x、SpringCloud、AntDesignof...
- 常见文件系统格式有哪些(文件系统类型有哪几种)
-
PART.01常见文件系统格式有哪些常见的文件系统格式有很多,通常根据使用场景(Windows、Linux、macOS、移动设备、U盘、硬盘等)有所不同。以下是一些主流和常见的文件系统格式及其特点:一...
- Oracle MySQL Operator部署集群(oracle mysql group by)
-
以下是使用OracleMySQLOperator部署MySQL集群的完整流程及关键注意事项:一、部署前准备安装MySQLOperator通过Helm安装Operator到Ku...
- LibreOffice加入"转向Linux"运动
-
LibreOffice项目正准备削减部分Windows支持,并鼓励用户切换到Linux系统。自Oracle放弃OpenOffice后,支持和指导LibreOffice开发的文档基金会对未来有着明确的观...
- Oracle Linux 10发布:UEK 8.1、后量子加密、增强开发工具等
-
IT之家6月28日消息,科技媒体linuxiac昨日(6月27日)发布博文,报道称OracleLinux10正式发布,完全二进制兼容(binarycompatibility...
- 【mykit-data】 数据库同步工具(数据库同步工具 开源)
-
项目介绍支持插件化、可视化的数据异构中间件,支持的数据异构方式如下MySQL<——>MySQL(增量、全量)MySQL<——>Oracle(增量、全量)Oracle...
- oracle关于xml的解析(oracle读取xml节点的属性值)
-
有时需要在存储过程中处理xml,oracle提供了相应的函数来进行处理,xmltype以及相关的函数。废话少说,上代码:selectxmltype(SIConfirmOutput).extract...
- 如何利用DBSync实现数据库同步(通过dblink同步数据库)
-
DBSync是一款通用型的数据库同步软件,能侦测数据表之间的差异,能实时同步差异数据,从而使双方始终保持一致。支持各种数据库,支持异构同步、增量同步,且提供永久免费版。本文介绍其功能特点及大致用法,供...
- MYSQL存储引擎InnoDB(八十):InnoDB静态数据加密
-
InnoDB支持独立表空间、通用表空间、mysql系统表空间、重做日志和撤消日志的静态数据加密。从MySQL8.0.16开始,还支持为模式和通用表空间设置加密默认值,这允许DBA控制在这些模...
- JDK高版本特性总结与ZGC实践(jdk高版本兼容低版本吗)
-
美团信息安全技术团队核心服务升级JDK17后,性能与稳定性大幅提升,机器成本降低了10%。高版本JDK与ZGC技术令人惊艳,且JavaAISDK最低支持JDK17。本文总结了JDK17的主要...
- 4 种 MySQL 同步 ES 方案,yyds!(两个mysql数据库自动同步的方法)
-
本文会先讲述数据同步的4种方案,并给出常用数据迁移工具,干货满满!不BB,上文章目录:1.前言在实际项目开发中,我们经常将MySQL作为业务数据库,ES作为查询数据库,用来实现读写分离,...
- 计算机Java培训课程包含哪些内容?其实就这六大块
-
不知不觉秋天已至,如果你还处于就业迷茫期,不如来学习Java。对于非科班小白来说,Java培训会更适合你。提前了解下计算机Java培训课程内容,会有助于你后续学习。下面,我就从六个部分为大家详细介绍...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- Java面试宝典之问答系列(java面试回答)
- ADG (Active Data Guard) 数据容灾架构下,如何配置 Druid 连接池?
- SpringBoot多数据源dynamic-datasource快速入门
- SpringBoot项目快速开发框架JeecgBoot——项目简介及系统架构!
- 常见文件系统格式有哪些(文件系统类型有哪几种)
- Oracle MySQL Operator部署集群(oracle mysql group by)
- LibreOffice加入"转向Linux"运动
- Oracle Linux 10发布:UEK 8.1、后量子加密、增强开发工具等
- 【mykit-data】 数据库同步工具(数据库同步工具 开源)
- oracle关于xml的解析(oracle读取xml节点的属性值)
- 标签列表
-
- oracle位图索引 (74)
- oracle批量插入数据 (65)
- oracle事务隔离级别 (59)
- oracle 空为0 (51)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)