面试(1)——Bigo

目录

一.技术一面

1.什么是内存泄漏和内存溢出?

2.JVM 怎么判断对象是无用对象?

3.根搜索算法中的根节点可以是哪些对象?

4.重载和重写的区别?

5.重写有什么限制没有?

6.Java 有哪些同步工具?

7.这两者有什么区别?

8.ArrayList 和 LinkedList 的区别?

9.这两种集合哪个比较占内存?

10.说一下 HashMap 的底层结构?

11.HashMap 为什么线程不安全,1.7 版本之前 HashMap 有什么问题?

12.了解 ConcurrentHashMap 吗?说一下它为什么能线程安全?

13.哪些方法需要锁住整个集合的?

14.看你简历写着你了解 RPC 啊,那你说下 RPC 的整个过程?

15.服务端获取客户端要调用的接口信息后,怎么找到对应的实现类的?

16.dubbo 的负载均衡有几种算法?

17.你说的最少活跃数算法是怎么回事?

18.服务端怎么知道客户端要调用的算法的?

19.你用过 redis 做分布式锁是吧,你们是自己写的工具类吗?

20.线程拿到 key 后是怎么保证不死锁的呢?

21.如果这个过期时间到了,但是业务程序还没处理完,该怎么办?

22.那如果多个业务都用到分布式锁的话,每个业务都要保证幂等性了,有没有更好的方法?

23.你那边有纸和笔吧,写一道算法,用两个栈模拟一个队列的入队和出队?

二.技术二面

1.说下你最熟悉的项目吧。

2.你对这个项目这么熟悉,那你根据你的理解画一下你的项目架构图,还有说下你具体参与了哪部分。

3.你的项目用到了 Spring Cloud GateWay,既然你已经有 nginx 做网关了,为什么还要用 gateWay 呢?

4.熔断器 Hystrix 最主要的作用是什么?

5.你的项目用到了 redis,你们的 redis 是怎么部署的?

6.说一下你对哨兵模式的理解?

7.那你们为什么要用哨兵模式呢?怎么不用集群的方式部署呢?

8.集群也是能保证高可用的,你知道它又是怎么保证主从一致性的吗?

9.你肯定有微信吧,如果让你来设计微信朋友圈的话,你会怎么设计它的属性成员呢?

10.微信用户有接近 10 亿之多,那肯定要涉及到分库分表,如果是你的话,怎么设计分库分表呢?

11.这边差不多了,最后你写一道算法吧,有一组未排序的整形数组,你设计一个算法,对数组的元素两两配对,然后输出最大的绝对值差和最小的绝对值差的"对数"。

三.技术三面

1.对事务了解吗?说一下事务的隔离级别有哪些?

2.你做过电商,那应该知道下单的时候需要减库存对吧,假设现在有两个服务 A 和 B,分别操作订单和库存表,A 保存订单后,调用 B 减库存的时候失败了,这个时候 A 也要回滚,这个事务要怎么设计?

3.了解过读写分离吗?

4.你说读的时候读从库,现在假设有一张表 User 做了读写分离,然后有个线程在一个事务范围内对 User 表先做了写的处理,然后又做了读的处理,这时候数据还没同步到从库,怎么保证读的时候能读到最新的数据呢?

5.你的项目里用到了 rabbitmq,那你说下 mq 的消费端是怎么处理的?

6.也就是说你的 mq 是先保存到数据库中,然后业务逻辑就是从 mq 中读取消息然后再处理的是吧?

7.那你的消息是唯一的吗?

8.你怎么保证消息一定能被消费?或者说怎么保证一定能存到数据库中?

9.好,那你整理一下你的消费端的整个处理逻辑流程,然后说说你的 ack 是在哪里返回的?

10.按照你这样画的话,如果数据库突然宕机,你的消息该怎么确认已经接收?

11.那如果发送端的服务是多台部署呢?你保存消息的时候数据库就一直报唯一性的错误?

12.现在你来设计一个 map,然后有两个线程对这个 map 进行操作,主线程高速增加和删除 map 的元素,然后有个异步线程定时去删除 map 中主线程 5 秒内没有删除的数据,你会怎么设计?


一.技术一面

1.什么是内存泄漏和内存溢出?

(溢出是指创建太多对象导致内存空间不足,泄漏是无用对象没有回收)

2.JVM 怎么判断对象是无用对象?

(根搜索算法,从 GC Root 出发,对象没有引用,就判定为无用对象)

3.根搜索算法中的根节点可以是哪些对象?

(类对象,虚拟机栈的对象,常量引用的对象)

4.重载和重写的区别?

(重载发生在同个类,方法名相同,参数列表不同;重写是父子类之间的行为,方法名好参数列表都相同,方法体内的程序不同)

5.重写有什么限制没有?

6.Java 有哪些同步工具?

(synchronized 和 Lock)

7.这两者有什么区别?

8.ArrayList 和 LinkedList 的区别?

(ArrayList 基于数组,搜索快,增删元素慢,LinkedList 基于链表,增删快,搜索因为要遍历元素所以效率低)

9.这两种集合哪个比较占内存?

(看情况的,ArrayList 如果有扩容并且元素没占满数组的话,浪费的内存空间也是比较多的,但一般情况下,LinkedList 占用的内存会相对多点,因为每个元素都包含了指向前后节点的指针)

10.说一下 HashMap 的底层结构?

(数组 + 链表,链表过长变成红黑树)

11.HashMap 为什么线程不安全,1.7 版本之前 HashMap 有什么问题?

(扩容时多线程操作可能会导致链表成环的出现,然后调用 get 方法会死循环)

12.了解 ConcurrentHashMap 吗?说一下它为什么能线程安全?

(用了分段锁)

13.哪些方法需要锁住整个集合的?

(读取 size 的时候)

14.看你简历写着你了解 RPC 啊,那你说下 RPC 的整个过程?

(从客户端发起请求,到 socket 传输,然后服务端处理消息,以及怎么序列化之类的都大概讲了一下)

15.服务端获取客户端要调用的接口信息后,怎么找到对应的实现类的?

(反射 + 注解吧,这里也不是很懂)

16.dubbo 的负载均衡有几种算法?

(随机,轮询,最少活跃请求数,一致性 hash)

17.你说的最少活跃数算法是怎么回事?

(服务提供者有一个计数器,记录当前同时请求个数,值越小说明该服务器负载越小,路由器会优先选择该服务器)

18.服务端怎么知道客户端要调用的算法的?

(socket 传递消息过来的时候会把算法策略传递给服务端)

19.你用过 redis 做分布式锁是吧,你们是自己写的工具类吗?

(不是,我们用 redission 做分布式锁)

20.线程拿到 key 后是怎么保证不死锁的呢?

(给这个 key 加上一个过期时间)

21.如果这个过期时间到了,但是业务程序还没处理完,该怎么办?

(额......可以在业务逻辑上保证幂等性吧)

22.那如果多个业务都用到分布式锁的话,每个业务都要保证幂等性了,有没有更好的方法?

(额......思考了下暂时没有头绪,面试官就说那先跳过吧。事后我了解到 redission 本身是有个看门狗的监控线程的,如果检测到 key 被持有的话就会再次重置过期时间)

23.你那边有纸和笔吧,写一道算法,用两个栈模拟一个队列的入队和出队?

(因为之前复习的时候对这道题有印象,写的时候也比较快,大概是用了五分钟,然后就拍成图片发给了面试官,对方看完后表示没问题就结束了面试。)

 

二.技术二面

1.说下你最熟悉的项目吧。

(我就拿我上家公司最近做的一个电商项目开始介绍,从简单的项目描述,到项目的主要功能,以及我主要负责的功能模块,吧啦吧啦..............)

2.你对这个项目这么熟悉,那你根据你的理解画一下你的项目架构图,还有说下你具体参与了哪部分。

(这个题目还是比较麻烦的,毕竟我当时离职的时间也挺长了,对这个项目的架构也是有些模糊。当然,最后还是硬着头皮还是画了个大概,从前端开始访问,然后通过 nginx 网关层,最后到具体的服务等等,并且把自己参与的服务模块也标示了出来)

3.你的项目用到了 Spring Cloud GateWay,既然你已经有 nginx 做网关了,为什么还要用 gateWay 呢?

(nginx 是做负载均衡,还有针对客户端的访问做网关用的,gateWay 是接入业务层做的网关,而且还整合了熔断器 Hystrix)

4.熔断器 Hystrix 最主要的作用是什么?

(防止服务调用失败导致的服务雪崩,能降级)

5.你的项目用到了 redis,你们的 redis 是怎么部署的?

(额。。。。好像是哨兵模式部署的吧。)

6.说一下你对哨兵模式的理解?

(我对哨兵模式了解的不多,就大概说了下 Sentinel 监控之类的,还有类似 ping 命令的心跳机制,以及怎么判断一个 master 是下线之类。。。。。)

7.那你们为什么要用哨兵模式呢?怎么不用集群的方式部署呢?

一开始 get 不到他的点,就说哨兵本身就是多实例部署的,他解释了一下,说的是 redis-cluster 的部署方案。(额......redis 的环境搭建有专门的运维人员部署的,应该是优先考虑高可用吧..........开始有点心慌了,因为我也不知道为什么)

哦,那你是觉得集群没有办法实现高可用吗?(不....不是啊,只是觉得哨兵模式可能比较保证主从复制安全性吧........我也不知道自己在说什么)

8.集群也是能保证高可用的,你知道它又是怎么保证主从一致性的吗?

(好吧,这里真的不知道了,只能跳过)

9.你肯定有微信吧,如果让你来设计微信朋友圈的话,你会怎么设计它的属性成员呢?

(嗯......需要有用户表,朋友圈的表,好友表之类的吧)

10.微信用户有接近 10 亿之多,那肯定要涉及到分库分表,如果是你的话,怎么设计分库分表呢?

(这个问题考察的点比较大,我答的其实一般,而且这个过程面试官还不断的进行连环炮发问,导致这个话题说了有将近 20 分钟,限于篇幅,这里就不再详述了)

11.这边差不多了,最后你写一道算法吧,有一组未排序的整形数组,你设计一个算法,对数组的元素两两配对,然后输出最大的绝对值差和最小的绝对值差的"对数"。

(听到这道题,我第一想法就是用 HashMap 来保存,key 是两个元素的绝对值差,value 是配对的数量,如果有相同的就加 1,没有就赋值为 1,然后最后对 map 做排序,输出最大和最小的 value 值,写完后面试官说结果虽然是正确的,但是不够效率,因为遍历的时间复杂度成了 O(n^2),然后提醒了我往排序这方面想。我灵机一动,可以先对数组做排序,然后首元素与第二个元素做绝对值差,记为 num,然后首元素循环和后面的元素做计算,直到绝对值差不等于 num 位置,这样效率比起 O(n^2)快多了。)

 

三.技术三面

1.对事务了解吗?说一下事务的隔离级别有哪些?

(我以比较了解的 Spring 来说,把 Spring 的四种事务隔离级别都叙述了一遍)

2.你做过电商,那应该知道下单的时候需要减库存对吧,假设现在有两个服务 A 和 B,分别操作订单和库存表,A 保存订单后,调用 B 减库存的时候失败了,这个时候 A 也要回滚,这个事务要怎么设计?

(B 服务的减库存方法不抛异常,由调用方也就是 A 服务来抛异常)

3.了解过读写分离吗?

(额。。。大概了解一点,就是写的时候进主库,读的时候读从库)

4.你说读的时候读从库,现在假设有一张表 User 做了读写分离,然后有个线程在一个事务范围内对 User 表先做了写的处理,然后又做了读的处理,这时候数据还没同步到从库,怎么保证读的时候能读到最新的数据呢?

(听完顿时有点懵圈,一时间答不上来,后来面试官说想办法保证一个事务中读写都是同一个库才行)

5.你的项目里用到了 rabbitmq,那你说下 mq 的消费端是怎么处理的?

(就是消费端接收到消息之后,会先把消息存到数据库中,然后再从数据库中定时跑消息)

6.也就是说你的 mq 是先保存到数据库中,然后业务逻辑就是从 mq 中读取消息然后再处理的是吧?

(是的)

7.那你的消息是唯一的吗?

(是的,用了唯一约束)

8.你怎么保证消息一定能被消费?或者说怎么保证一定能存到数据库中?

(这里开始慌了,因为 mq 接入那一块我只是看过部分逻辑,但没有亲自参与,凭着自己对 mq 的了解就答道,应该是靠 rabbitmq 的 ack 确认机制)

9.好,那你整理一下你的消费端的整个处理逻辑流程,然后说说你的 ack 是在哪里返回的?

(听到这里我的心凉了一截,mq 接入这部分我确实没有参与,硬着头皮按照自己的理解画了一下流程,但其实漏洞百出)

10.按照你这样画的话,如果数据库突然宕机,你的消息该怎么确认已经接收?

(额.....那发送消息的时候就存放消息可以吧.........回答的时候心里千万只草泥马路过........行了吧,没玩没了了。)

11.那如果发送端的服务是多台部署呢?你保存消息的时候数据库就一直报唯一性的错误?

(好吧,你赢了。。。最后硬是憋出了一句,您说的是,这样设计确实不好。。。。)

12.现在你来设计一个 map,然后有两个线程对这个 map 进行操作,主线程高速增加和删除 map 的元素,然后有个异步线程定时去删除 map 中主线程 5 秒内没有删除的数据,你会怎么设计?

(这道题我答得并不好,做了下简单的思考就说可以把 map 的 key 加上时间戳的标志,遍历的时候发现小于当前时间戳 5 秒前的元素就进行删除,面试官对这样的回答明显不太满意,说这样遍历会影响效率,ps:对这道题,大佬们如果有什么高见可以在评论区说下!)

 

你可能感兴趣的:(#,大数据面试经历)