Loading

[网络面试经验贴]

1.子类与父类的加载过程,静态方法重写,静态代码块
2.Java中sync阻塞与可重入是怎么实现的,轻量级锁这么可重入,重量级锁维护了wait set
3.sync锁升级,AQS
4.用户态,内核态
5.wait与sleep,调用后操作系统发生了什么,sleep是怎样唤醒的
6.concurrenthashmap介绍,size()怎么个流程
7.单例模式,双重校验锁,volatile机制,可见性原理(MESI),直接将sync加方法上的锁粒度问题,类加载机制的懒汉
8.MySQL中select语句执行流程
9.事务与并发MVCC
10.rr隔离级别下的间隙锁导致的死锁问题
11.索引的注意事项
12.uuid与自增id,顺序写与随机写,空间占用,可能导致极端情况varchar数据存不下导致的行溢出问题,同时网络消耗(其实这都不重要,能消耗多少)
11.mysql能否保证数据不丢失
12.事务注解失效的情况,你是怎么避免的,主要说了代理类,吃异常的一些问题
13.spring循环依赖解决,两级缓存能否解决,可以,只是需要实例化后都暴露且暴露代理类,三级缓存提供了一个延迟以及按需加载的思想(不知道理解的对不对),判断是否需要加载代理类,以及需要时才提前暴露
14.mybatis执行流程,缓存有了解吗,说一下优缺点
15.实习问题
手撕:链表加法

9.3二面(65min)
1.聊一下hashmap,负载因子与len = 8锁涉及到的概率问题,树化的优缺点
2.介绍concurrenthashmap -> CAS + sync + volatile,主要说一下尽量使用用户态的CAS去尝试,这点再AQS中也有体现(不知道我的理解有没有问题)
3.你说了concurrenthashmap 这么多优点,那有没有缺点 -> 主要提了一下并发机制,常见的缓存,MVCC中rc,rr允许读旧数据,尽管volatile无需加锁,但cpu缓存一致性时也存在消耗,可能在读写并发量较高时性能有所缺陷
4.MySQLselect语句流程(我真绷不住了,一面问了我没复习)
5.MySQL如何解析到select语法错误的,客户端连接时,用户名密码存在错误时MySQL如何解决的
6.介绍B+树,主要从多叉有序平衡,树高来说
7.你说了B+树有这么多优点,那有没有缺点,这边主要讲了并发量高的insert/delete场景下页分裂时锁整棵树,讲了B-link树的一些优化点,谈到了跳表设计机制
8.说一下常用的jdk,1.8的新特性,lambda实现原理,功能性接口
9.实习拷打

手撕:山峰数组二分找变化点下标

补充:简历上的实习内容有些不清楚,还好找同事咨询了,不然也是难绷
有保底心态确实会不一样

tcp的可靠性实现(一溜烟把rdt、流量控制、拥塞控制全答上去了)
4、介绍一下线程通信(synchronized、volatile、wait()/notify()这个不记得、管道输入/输出流、join也不记得、threadlocal)
5、介绍一下java并发里的锁(我从乐观锁和悲观锁两种里答,乐观锁记得一个cas,悲观锁记得syschronized和reentrantLock什么的)
6、介绍一些线程池的参数,拿一个举例在面对一个新的任务时线程池的处理流程(参数没答全,我把常见的Single、Fixed、Scheduled、Cache列出来,拿稍微熟悉一点的Fixed举例)
7、MySQL的事务介绍一下(ACID,D是持久性还磕巴了,面试官替我说了)
8、事务怎么保证持久性的?(依稀记得用日志实现,不太有印象,尽量说了些自己的理解,回去一查是redo log那些)
算法题:力扣 最短无序子序列 用On复杂度实现
一开始的思路是nlogn的,想半天没想出怎么做,最后面试官给一些引导做出来了,但是还存在一些边界问题,又寄。

抖音开放平台一面(8.17)50min:

1 自我介绍(详细介绍项目)

2 项目中Redis怎么用的(缓存,分布式锁)

3 Redis分布式锁的具体用法,如何实现的,加锁(加唯一标识,设置过期时间,保证原子性)具体命令,解锁(读取,判断和del),还知道可以用哪些来实现分布式锁

4 Rocketmq的事务消息的执行流程,详细说一下

5 项目中如何解决消息重复消费的,具体说一下

6 项目中的令牌大闸如何实现的,令牌桶算法

7 还知道哪些限流算法(说了漏桶算法),漏桶算法和令牌桶算法的区别?

8 项目为什么选令牌桶算法不选漏桶算法?

9 令牌桶算法是自己实现的还是用的组件,令牌桶算法如何保证不会单击TPS在某一刻超出系统承受能力(没答出来)

10 Redis有哪些优势,为什么它应用这么广泛,为什么适合做缓存

11 Redis数据类型,经典的应用场景?

12 Redis的有序集合的底层实现原理(说了跳表,还不够,面试官还问了另外一种实现,没答出来)

14 Redis的持久化机制(AOF和RDB,区别,应用场景,AOF的缺点,RDB的缺点)

15 MySQL的两阶段提交(具体讲解,如果中间几个阶段分别崩溃怎么办)

16 redo log和bin log的用途,区别

17 MySQL索引数据结构,为什么不用二叉查找树,为什么不用B树,B+树和B树的区别

18 事务的持久性如何保证(redo log 和bin log)

19 事务的隔离性如何保证(MVCC+锁,分别讲实现原理,还有间隙锁)

20 MVCC的如何判断行记录对某一个事务是否可见

21 MVCC在四种隔离级别中如何实现(讲了只能在RC和RR下实现,追问RC和RR两者实现的区别)

22 RR解决了什么问题,有没有解决幻读,MySQL默认隔离级别是什么,各大企业通常采用什么隔离级别,为什么

23 HTTPS 的加密过程

24 Java垃圾回收(说了可达性分析算法,分代回收,标记复制,标记整理和标记清除…)

25 LC209 (ACM模式)

抖音开放平台二面(8.22) 75min:

1 项目中的技术难点,怎么解决?

2 项目中使用Redis分布式锁就可以解决超卖问题吗?

3 Redis分布式锁如何实现(说了三个点,设置过期时间,保证设置锁和过期时间的原子性,保证锁的值的唯一性),释放锁呢(先判断,再释放,同样需要保证原子性)

4 这样设置分布式锁有什么问题吗(单个Redis宕机,则锁失效。为了提升锁的可靠性,Redis集群部署分布式锁,RedLock算法)

6 MySQL前缀索引,最左匹配原则,联合索引底层怎么放的,还举了几个例子考察我会不会走索引

7 Kafka的 reBalance, raft算法(不会,崩),consumer和partition的对应关系(单播消息,多播消息)

8 Kafka的高可靠性如何保证(说了副本冗余机制,详细介绍broke和partition中leader与follower之间的关系)

9 Kafka的滚动策略(完全不知道是什么,崩),面试官说看得出来我有在认真准备面试,但是有些点还是没有覆盖到

10 Kafka 的零拷贝,详细说一下(从操作系统层面说)

12 MySQL为什么要用redo log?(缓冲区刷盘不是每次一点改动就立即执行的,为了执行性能高,会将多次改动结果一起刷盘,为了防止还没刷盘时MySQL宕机导致数据丢失,所以用了redo log,将改动同时写在redo log)

追问redo log也是磁盘中的文件,也要写盘,为什么性能会提高(顺序写和随机写)

追问为什么不用bin log来实现崩溃恢复(说了redo log的环形结构,刷盘指针和写日志的指针记录位置)

13 如何设置一个秒杀系统(说了Redis缓存预热库存,在Redis中扣减库存,分布式锁保证查库存和扣减库存的原子性,同时用分布式事务消息保证MySQL与Redis的库存一致性,限流算法,页面静态化减轻服务器压力)

14 令牌桶算法,还知道哪些限流算法,详细说下,两种算法的区别和适用场景

15 给我刚刚设计的秒杀系统加点料,秒杀一个商品,要求立即返回商品编号,而不是简单扣减库存(这个真的崩溃,因为我设置的秒杀系统扣减MySQL库存是异步执行的,现在要求返回秒杀成功后立即给用户一个反馈秒杀的商品的编号是多少,这就成了同步,但又要保证原来的异步的性能,提到把商品编号加入到Redis,说了对同步调用和异步调用的思考)

追问具体如何设置 到Redis中(回答用Redis的hash数据类型,给请求编码,requestId,作为redis的hash类型的键,商品编号作为值,完全乱扯。。)

再次被追问存到Redis中如何解决 请求的公平性(请求先到先秒杀成功)(不会,被面试官diss我紧张过度)

16 算法 二叉树路径和(自己建树)(秒了)

  实现千位分隔符(这边因为紧张,加上对字符串的插入和删除的api不熟悉,卡在字符串那里了,面试官让我换一个思路,不一定要用字符串)

   然后慌了,没搞出来,被diss脑筋太死了,重要的是解决问题,没限制时间复杂度,然后跟我说可以用数组,队列都行。然后扯了好大一堆,就因为字符串API不熟悉这么点小问题就把我拦住了,没有解决问题的能力,其实有很多思路。重要的是解决问题,方法不计。。。然后这边心态是真的彻底崩了。面试官说了很多安慰的话,看得出来我是紧张过度才没写出来easy题目,从我前一道算法题看得出我写代码速度没问题。。。

17 最近看什么书(不一定要是技术类),具体讲了什么(因为某些原因答得稀烂,然后被面试官教育了一翻,说这题答得不行,主要为了考察沟通能力和记忆力,我连最近看的书的内容都不能很好的讲出来。然后谈看这些书是出于兴趣,但总要留下些什么)

18 反问(问了面试官两个问题,面试官很耐心的解答,收获颇多)

目前为止收获最大的一场面试,对面试官佩服至极,真的是技术大牛。还学到了很多方法论。

抖音开放平台三面(8.25)55min(三面挂)

问了40分钟项目。。。把项目问了个底朝天。。。。

1 问项目背景,是不是自己练手做的,是自己一个人实现的后端吗,时间如何安排的,项目部署过吗,具体做了些什么

2 扣减库存时MySQL行锁遇到过吗,没优化前QPS是多少?

3 用的什么压测工具?压的时候考虑的是单个商品的扣减库存还是整个系统的?为什么不压测整个系统的(属实没考虑到)

4 你觉得单商品QPS达到多少是可以达到要求,你做项目前预期是多少?

5 你这个秒杀的TPS是指什么,是指从接口层面压测然后扣减Redis库存和Rocketmq发消息扣减库存这一系列流程吗?

6 我理解你这个TPS到了这么多,Rocketmq端肯定是会有消息积压的,你这个消息积压量大概是多少(没考虑到,崩)?

7 你知道消息队列会有消息积压的问题吗(知道,消费消息的速度赶不上生产消息的速度)

RocketMQ单机也可支持亿级的消息积压能力,500个线程,1200次循环,60万条消息,即使消费者消费消息过慢,也不会产生消息积压问题。

8 Redis中扣减库存很快,而MySQL扣减库存很慢,你知道这会产生消息积压的问题吧,你遇到会如何解决呢?(考虑并发度,前端限流)

追问 除了前端限流之外,消费端能做什么呢,写MySQL还是很慢,有什么其他的方法吗(乱说一弃,崩)

9 在优化之前是用MySQL扣减库存吧,那个sql如何写扣减保证不会超卖 (先查再扣,保证事务,写sql)

追问还有其他方法吗,可以不用合并这两个操作为一个事务吗,如何写sql?

10 你如何对项目进行优化(答了两个点:1 把扣减库存和回补库存操作 改成了 查询库存和扣减库存,并用Redis分布式锁保证原子性)

   2  在消费者端实现消息幂等,防止消息被重复消费导致MySQL和Redis的库存不一致。

追问具体流程,说了很久(看样子面试官听明白了)

11 那按照你说的你本地事务在Redis中扣减库存时,还是会涉及MySQL写操作(插入流水号),那性能又是如何提升的呢?你觉得会和你原来扣减库存时遇到行锁一样有瓶颈吗(不会)?为什么呢?

(流水号的主键是uuid,是可以多线程插入行记录,而原来用行锁扣减库存只能单线程执行)

12 你觉得你现在做了这么多优化,还有哪些点未来是可以继续优化的(我都已经说了两个优化的点了,还让我继续优化。)

(说了下单未支付可以考虑回补库存,延时消息实现)

13 Rocketmq延时消息原理?(不会,寄)

14 项目中有遇到啥问题,怎么排查的?(扯了很多,被追问很多)

15 你项目中用到了分布式锁,分布式事务消息,看你还解决了分布式session,那你说说分布式id的生成吧(真的没了解,只知道听说过这个东西)

16 项目用的java是吧,SpringBoot开发的好处是什么,你对比一下Spring说说看?

17 SpringBoot自动装配?SpringBoot starter 如何实现?SpringBoot源码,Spring源码?(没看过)那你看过哪些源码?(JUC.lock的源码)

18 Java的可重入锁是怎么实现的,你从源码角度说一下,怎么就可重入了

19 Java中多个线程如何通信?(synchronized,wait和notify搭配使用,lock,await和notifyAll搭配使用。需要详细展开讲讲)

20 Thread类中有三个方法join,yiled和sleep,说说这三个方法的区别?

21 sleep和Object的wait的区别(从synchronized的角度回答,wait只能和它搭配使用,并且调用后释放锁,sleep则不会释放锁)

22 Java线程池?ThreadPoolExcutor? 线程池的执行流程?

23 你项目中用了很多MQ,如何保证不会丢失消息(生产者:事务消息;broker:同步刷盘,主从部署集群;consumer:至少一次消费原则,消费失败重试)

24 可是同步刷盘性能很低呀,那怎么保证效率呢,你觉得各大公司怎么做的?

25 长短链接问题(如何把长链接变成短链接,但访问的资源不变,后端如何做?),寄

26 你觉得你做了这两个的项目收获了什么,获得了什么成长

27 你觉得你这个项目中有没有做的不好的地方呢?

29 设计模式了解哪些(单例,模板方法模式)

tiktok直播一面(9.6 75min)

1 介绍项目,为什么用分布式锁,这样做会有什么问题(不如直接使用lua脚本解决原子性问题)

2 为什么前一个项目用Kafka,后一个项目用Rocketmq

3 如何保证Redis和MySQL数据的一致性,事务消息的具体流程是什么

4 为什么要用令牌桶算法,你还知道哪些限流算法,区别

5 如果给你一个分布式系统,要求你限流,你怎么做,如何优化

6 Java线程池的工作原理

7 Java线程池是如何销毁线程的,如果是你,你怎么设计

8 线程池的好处,为什么要使用线程池

9 Java垃圾回收,如何解决跨代引用问题的(忘了),如果让你设计,你如何做

10 Java中的锁说一下,lock和synchronized的使用方面的区别,lock和synchronized在锁的灵活性方面的区别

11 volatile关键字详细说一下

12 在网址中输入url,说下过程,各层都发生了什么,详细点

13 常见排序算法的时间复杂度说一下

14 归并排序复杂度为什么是nlogn,让你合并多个大小为n的数组,你如何做(具体点),逐个合并会有什么问题

15 项目中压测如何做的,秒杀流程是怎样的

16 项目中整个限流过程是怎样的

17 如果你没有库存信息,你如何设置令牌的初值,让你的QPS和令牌数完美搭配起来

18 java线程的资源都有哪些,线程栈的大小大致在多少

19 有没有遇到过栈溢出的异常,为什么无限递归会造成栈溢出

20 算法题:树的子结构

21 代码题:两个线程交替打印A和B

tiktok直播二面 9.9 45min

1 介绍数据库索引

2 为什么把二叉查找树变成多路平衡查找树就能减少磁盘IO?为什么树的高度决定了磁盘的IO次数 ?如果查找某一个数据,用二叉查找树和用B+树的时间复杂度分别是多少?

3 B+树的叶子结点的默认大小是多少?如果把B树的非叶子结点只存放指针,那B树是不是就和B+树一样了呢

4 除了二叉树,B+树,B树这些索引,还有什么常见的存储数据结构适合做索引呢?

5 为什么InnoDB不用哈希做索引,用哈希和用B+树有什么区别?

6 Redis里面有序集合用的索引?介绍一下跳跃表,与哈希的区别?

7 MySQL事务隔离级别有哪些,会产生哪些问题,MySQL默认的隔离级别是什么

8 MySQL如何实现可重复读?MVCC的底层原理?

9 看你用过Rocketmq,也用过Kafka,那你说一下这两者不一样的地方?或者设计上有哪些不一样?

10 为什么你认为Rocketmq的可靠性比Kafka好?(跟面试掰扯很久,被驳回)

11 Rocketmq消费消息失败了之后,是如何保证消息不丢失的呢

12 那kafka也可以按照Rocketmq这样做呀,为什么kafka可靠性就不如Rocketmq高呢

13 Kafka和Rocketmq除了你说的这些区别,还有什么区别?(底层存储消息的方式)

14 说说两者底层存储消息方式的区别(Rocketmq把所有消息存到一个文件中,每个队列有索引标注,kafka的消息是分区存放)

15 为什么这两者要这么设计(Rocketmq磁盘顺序写,Kafka磁盘随机写,前者性能更高)

被追问Rcoketmq虽然是顺序写,但是也带来了随机读的问题,为什么这么设计

16 Redis如何实现高可用和高可靠的?

17 Redis的主从复制是同步的还是异步的?异步和同步的优缺点?

18 了解go吗,说说协程,为什么要用协程?

19 为什么多线程访问共享资源需要加锁处理?

22 让你设计一个任务调度器的类,add一个task,指定这个task的执行时间,可以add很多任务,但每个task执行的时间又各不相同,你如何实现,用什么数据结构?(优先队列,分数为时间戳,队头为最先执行的任务,队尾是最后执行的任务)

23 优先队列的实现原理

24 算法题:二叉树的完全性检验

tiktok直播三面(9.20)

对相关组件的应用能力,对问题的解决方案,具体设计

用Redis的set和string分别存用户id和点赞总数,达成显示点赞总数的目的,同时set可以保证点赞只能一次,重复点赞会取消,还能显示点赞人的信息。为什么用Redis,出于性能考虑,并且天然的数据结构很适合应用。string和set是两个操作,引出原子性问题,redis如何保证原子性?分布式锁和lua脚本。问Redis的热key问题,本地缓存(hashmap等)解决,问削峰限流问题,引出消息队列解决。问验证码存储问题,引出session,采用Redis优化解决。

4 问前面一二轮面试的复盘,再给次机会再答一次

5 算法题 大数相加(字符串可以是负整数,也可以是正整数,不能用API直接将字符串转成整数)

  1. 自我介绍:非常简短的介绍了自己的背景,感觉不是很重要
  2. 手撕:(大概25~30分钟)
    1. 拓扑排序:207. 课程表 (中等难度),变种,判断服务间依赖是否成环
      • 一开始很紧张,频繁报错,不过代码还是顺下来了,然后修改测试用例之后报错,打印debug的过程中面试官给了debug建议,但是他看错了,自己找到错误点修正之后没问题
    2. 编辑距离:72. 编辑距离 (中等难度),原题
      • 顺畅写完
  3. 计算机网络:
    1. http和https的区别,https里如何获取密钥(服务器公钥)
    2. TCP和UDP的本质区别,TCP是如何实现可靠传输的
  4. 操作系统:
    1. 进程间通信方式,同一台主机上可以使用套接字吗(可以)
    2. 虚拟内存是什么?虚拟内存实际在内存里还是硬盘里?
      • 这个问题答得有点磕磕绊绊,不过大致上是回答到了
  5. MySQL数据库:
    1. 索引的底层实现
    2. 主键索引和非主键索引的区别,叶子节点和非节点节点分别存储的是什么
      • 这个只回答对了主键索引的存储结构,非主键索引的答错了,面试官提了一句可以去了解一下就过掉了
  6. 项目:只拷打了Django项目,会追问技能点直到他弄清楚这个点实现的方式,以及作用
    • 用户权限分类这个回答自我感觉中规中矩
    • redis存储也勉强应对
    • 数据库索引解决N+1问题这块被问到了,因为一开始自己就没弄太清楚,这块后续还需要修正一下简历上的描述,最后以我回答这个点最开始的实现有问题结束
  7. 反问:
    1. 部门具体做的什么:人事管理系统,saas系统
    2. 流程:总共两轮技术面,一轮hr面
    3. 什么时候给答复:通过和不通过都会通知,一般一周内

但是当晚7: 00开始面试,面试总时长大概45分钟,一个小时之后接到了二面通知

2面记录

  1. 上来拷打新项目,主要是根据写的点来提问,但是问了一下之后就会开始发散:
    1. 问了架构设计是怎么来的,微服务怎样划分
    2. 画了什么图(uml类图),然后开始拓展软件开发时的图设计(基本不记得了,太久远)
    3. 对系统解耦性的理解,服务划分的粒度控制(答得很粗浅,感觉不是很好)
    4. 具体怎样实现的JWT
    5. 项目难点是什么?怎么解决的(当时没来得及更新简历,所以只答了一点点,感觉也没答好,面试官切入的点都正好卡在我了解的边缘)
    6. 其它的也不太记得了
  2. 问了前一个项目,也问到了权限控制和redis这一块,这里简历没写好,答得也不好,最新版简历已做修改
  3. 索引相关:
    1. 了解哪些索引(聚簇和二级索引),底层实现
    2. 为什么用B+树而不是B树,优势在哪
    3. 索引的最左匹配原则(这里我应该是对概念理解有误了,面试官提了一个问题没答出来)
      • 假设索引 A B C,现根据A 和 B筛选,请问会走这个索引吗?如果是根据A C,会走这个索引吗?
  4. 手撕(大概20分钟):接雨水,原题,卡了一小会儿思路,还是做出来了,撕完之后大概讲了下思路
  5. 一些问答

补充二面:还问了线程同步、怎么实现同步,具体问的啥不记得了

感觉答得不好,二面比一面切入点更细,问得更灵活,回答得都不太全面

2面将近50分钟,面完感觉寄了,目前也没收到消息

HR面记录(更新,没想到二面通过了)

两个hr,但是只有一个和我对话交流

  1. 自我介绍
  2. 主要围绕项目展开:你在项目中担任什么角色(组长),具体负责什么,怎么协调,项目的优化点有哪些
  3. 未来的打算:读研还是工作?考虑秋招吗?为什么?优先级选择
  4. 其它的学校项目经历,怎么解决问题,有遇到什么技术上的难点吗?
  5. 开发的时候注重代码规范吗?
  6. 学习新技术的周期,觉得自己是比较正常还是算比较快的速度?
  7. 有关注什么新兴技术吗?关注AI、数据等当下比较热门的领域吗?
    还有一些不太记得了,大致就是这些,聊的比较宽泛
    反问:什么时候会出结果?两到三个工作日通知
    总共聊了大概25分钟

自我介绍;
项目相关:介绍下有哪几些项目,各个项目大概实现的功能,针对项目简单了解了下流程;
Java相关:介绍下ArrayList 与 LinkedList 之间的区别?分析下插入以及删除元素的复杂度?
Java相关:PriorityQueue有了解吗?底层实现原理是什么?
Java相关:什么是序列化和反序列化?Java 中如何实现对象的序列化?
Java相关:介绍下Java中常用的并发工具类。ConcurrentHashMap和Hashtable两者的区别?ConcurrentHashMap的实现方式在JDK 1.7 和 JDK 1.8有什么区别?
Spring相关:介绍下什么是Spring MVC?包含哪些关键组件?当收到请求时各组件的处理流程?
Spring相关:介绍下什么是IoC和AOP?你提到了可以用来记录日志,大概说说怎么实现?
Spring相关:有了解过Bean的生命周期吗?Spring中 bean默认的作用域是什么?单例Bean如果有实例变量可能会存在什么问题?有哪些解决方法?
Mybatis相关:项目中使用到了Mybatis,介绍下什么是ORM框架?Mybatis的实现原理有了解吗?为什么只需要定义接口而不需要实现?MyBatis中的#{ }和${ }的区别?
MySQL相关:介绍下MySQL的常见数据类型及其用途?Char和Varchar两者的底层实现区别?有哪些优化方法,比如ip地址如何存储?
MySQL相关:MySQL有哪些存储引擎?各自的区别?
MySQL相关:介绍下什么是ACID?分别通过什么方式实现的?
MySQL相关:MySQL有哪些优化查询的方法?结合项目聊一聊具体怎么做?
分布式相关:什么是CAP定理?介绍下CP和AP?BASE理论有了解过吗?
分布式相关:分布式事务有哪些实现方式?介绍下如何使用消息队列的方式进行实现?你刚刚使用的是Rocketmq实现分布式事务,有了解过如何用kafka实现吗?
算法:Leetcode560 和为 K 的子数组。

posted @ 2024-07-12 14:42  Duancf  阅读(60)  评论(0)    收藏  举报