耗时一小时40分钟的美团一面

你好,我是yes。

上周一位读者给我发了他最近秋招美团的面试题,大概面了一小时40分钟,他说题目答的还行,只不过智力题的话没答好,对校招来说这就有点悬了,所以校招的小伙伴除了技术题,智力题也要好好准备下~

这篇文章,我把这些题分享一下,大致可以分为计算机网络类、Java基础类、JVM类、redis、mysql,最后还有个智力题,可以看到涉及的知识点还是比较广的,就少了个操作系统的。

先列举下题目,然后我会就个别题目分析一下。

计算机网络类

  1. 为什么要三次握手,四次挥手
  2. 客户端挂了的话,后续流程怎么处理
  3. tcp状态码之4xx 和5xx
  4. seesion 存在于哪里? 说说cookie 和 token

Java 基础类

  1. hashcode 和 equals ,对象相等 hashcode 一定相等吗?
  2. final finilize finally
  3. BIO AIO NIO 区别
  4. String 为什么不可变
  5. Integer 默认的范围值
  6. 集合遍历删除可以吗?
  7. ArrayList中的数组为什么用transient进行修饰?
  8. 线程池的退出过程
  9. 线程池队列已经满了,队列已经满了会怎样
  10. 单例模式 dcl 的介绍
  11. synchronized、 aqs、volidate
  12. cas aba问题

JVM

  1. 服务类变多对整体启动性能的影响有哪些?
  2. 不会 oom 的区域?
  3. 内存分配的方式?
  4. 访问对象的访问方式
  5. 用过什么垃圾回收器
  6. 垃圾回收算法有哪些
  7. 老年代引用新生代,除了 gc root 还用什么?
  8. 出现以下几种情况的话,说明那里出问题 ?

redis

  1. 为什么用 redis ,优点何在?
  2. 缓存穿透和缓存雪崩

mysql

  1. 说下表索引执行过程
  2. 索引怎样会失效?
  3. 什么情况会走索引?
  4. 大于或者等于的范围查询一定会使得索引失效吗?
  5. 说下事务中的二阶段提交
  6. 说下 change buffer

智力题

  1. 8个球,有7个一样重,快速找其中的一个
  2. 两次都是女孩的概率

解答部分

上面这些题目,之前我的面试仓库都包含了,大部分就不作解答的,大家可以自行去网站上查找。

有个别没提到的,或者稍微难一点的,我这里拿出来提下:

ArrayList中的数组为什么用transient进行修饰?

我们都知道 transient 标记的字段代表不序列化,而 ArrayList 的数组用 transient 当然就表示其内部的数据不序列化,那岂不是数据要没了?


并不是的。之所以这样标记,是因为我们数组的实际大小会大于真正的元素量,比如你的数组长度是10,实际上里面就只有5个元素。

如果正常序列化的话,那会把空值也给序列化了,所以为了只序列化实际有值的元素,ArrayList 用 transient 标记了 elementData字段,然后再实现了 writeObject 和 readObject 方法,里面的实现逻辑是只会序列化实际存在的元素。


简单来说就是为了避免多余元素的序列化,用 transient 标记了 elementData 字段避免使用默认的序列化方式,定义了 writeObject 和 readObject 实现了自定义的序列化方式。

老年代引用新生代,除了 gc root 还用什么?

这个场景就是假如当前要进行新生代 GC, 那可能存在老年代到新生代对象的引用,这部分如果要全区域扫描老年代,效率就低了,所以弄了个记忆集(Remembered Set)来优化这个跨代引用场景。

而记忆集的实现,一般用卡表,简单理解就是不是精确到具体老年代哪个地址对新生代有引用,而仅仅是一块区域对新生代有引用,这样记忆集就不会那么大,扫描起来也不会那么多,毕竟一个区域可能有好多都引用的新生代,还能合并一起标记了。

出现以下几种情况的话,你觉得是出了什么问题 ?


结合 5 点一起来看:CPU 不忙了,gc有抖动,但是年轻代基本稳定,老年代内存一直在变,说明对象应该是直接进去老年代,但是这些对象的生命周期又比较短,所以老年代内存涨涨涨,GC 了之后又下来,然后又涨涨涨,这就叫抖动

那什么样的对象不进新生代而是直接到老年代?

是大对象

跟着 GC 抖动的同时,线程数也在抖动,那说明肯定是哪块业务一次请求,new了很多线程,线程里new 了很多大对象,所以老年代大小就上去了, GC 就开始操作了。

等这波线程任务执行完之后,线程就关闭了,对象也就可以回收了,GC操作完之后,老年代大小又降下来了。

基本上就是这么个情况。

最后

好了,今天就说这么多,关于 mysql 的那个 change buffer 啥的,等我下篇吧,一起把 mysql 里面的各种 buffer 盘一遍,比如啥 Log Buffer、Double Write Buffer 等等。

其实上面这些问题都不是很难,最关键的还是看你有没有理解。就拿跨代引用的那个记忆集来说,肯定不会直接问你记忆集是什么,而是拐着弯的问,你只有理解了你才能联想起来。

包括 5 个因素的 GC 分析题,其实也是一样的,你需要理解整个 GC 的流程和原理,死记硬背的话这些题吃不住的。

好了,关于上面别的题目有疑问的话可以留言,我会选择性的给予解答,更多的其实我的面试仓库里面都整理了,可以去看看。

我是yes,从一点点到亿点点,我们下篇见~

#美团##面试##秋招#
全部评论
【说下表索引执行过程】我靠,这个是想问啥啊,explain嘛?
点赞 回复 分享
发布于 2022-09-07 13:05 四川
这篇文章跟JAVAGuide公众号一模一样,大家可以去看一下,你不是guide哥的话还是不要搬运别人的文章
点赞 回复 分享
发布于 2022-08-31 01:05 安徽
【大于或者等于的范围查询一定会使得索引失效吗】这个是不一定会的,但是不好解释
点赞 回复 分享
发布于 2022-09-07 12:57 四川
确实都要理解了才行   死记硬背没得搞
1 回复 分享
发布于 2022-08-23 19:13 天津
收藏了  校招都好难呀
1 回复 分享
发布于 2022-08-23 19:11 天津
m
点赞 回复 分享
发布于 2022-08-29 19:17 山东
m
点赞 回复 分享
发布于 2022-08-25 09:21 北京
多谢楼主的分享 上面这些问题 楼主分析的都很好
点赞 回复 分享
发布于 2022-08-23 19:18 天津

相关推荐

05-12 这一周的面试。字节暑期实习一面 C++ 后端,1 小时 40 分钟。有两三个聊天风格的问题。手撕代码做得一般。发面经攒人品 自我介绍面试官问 CTF 比赛是什么,我介绍比赛内容,说了一个 CTF 签到题。实验室研究方向项目和八股(40 分钟多)项目是一个重写 muduo 库,一个功能不多的 web server。面试官没有问 web server。我想写个协程库了。在做聊天项目,没做完。1. 介绍 muduo 网络库2. 为什么要有 muduo 库?它有什么价值?进一步引导,线上为什么要用 muduo 库,为什么不用其它方式,比如多线程?   (答完这里我掉线一次)3. 对 epoll 原理的理解4. epoll 相关的内核数据结构5. linux 上的进程,线程,协程(答了 linux 的 task_struct 记录一个进程的信息,线程也是一个 task struct,它们共享内存地址空间,等等)6. 操作系统调度的最小单位是什么?7. 一个进程的地址空间是怎么样的?8. 一个进程是怎么跑起来的?比如,在终端输入 top 命令,发生了什么?9. fork 系统调用有几个返回值?追问父进程中 fork 的返回值10. 一个进程把内存用光了会发生什么事?11. 你在 linux 上用什么软件?怎么使用,用到什么功能?追问 qemu 怎么拉起一个虚拟机。问,是自己折腾的吗?    - docker 的原理?追问,只用 namespace 就可以了吗?    - 为什么用 podman12. 在浏览器中输入一个网址,到网页展示出来,这个过程发生了什么?13. dns 查询过程14. 网络包到网卡之后,是怎么到用户进程的?15. 进程阻塞在 read 系统调用,有数据时怎么唤醒?你有看过代码吗?写代码题(40 分钟)在飞书里面的编辑器,像是一个 vscode,有代码自动补全。- 代码一:求有 n 个字母的集合的所有子集。比如,{a, b, c} 的所有子集有 8 个。(讲思路,实现代码,10 分钟多)- 代码二:三数之和(25 分钟多,一开始不记得双指针的解法,只好自己拿一个 map,一个 set,来保证唯一性。写完讲思路,问有没有其它方法,把双指针方法凑出来了)反问部门工作内容有几轮面试部门技术栈面试官问是第几次面试,有其它 offer 吗,能实习几个月
查看18道真题和解析 面试问题记录
点赞 评论 收藏
分享
05-16 10:17
河南大学 Java
全程50分钟,项目和实习没问,都是八股手撕:接雨水1、hashmap怎么实现的;扩容因子设置过大和过小有什么问题,为什么是0.75;为什么要选红黑树;可以用跳表来替换红黑树吗(这个点答的不是很好)2、concurrent hashmap线程安全原理,1.7和1.8的区别3、synchronized和 ReentrantLock的异同点;为什么有了synchronized之后,后面还要有ReentrantLock4、synchronized和 ReentrantLock的底层如何实现的5、垃圾回收机制介绍一下;G1还有新生代和老年代的概念吗;G1和CMS比有哪些优势6、浏览器打开一个url涉及的过程,结合计算机网络的角度详细说一说7、HTTP请求头常见的字段有哪些,保持长连接的字段是什么;加了keepAlive连接就不会中断了吗,怎么维护这个连接呢,何时中断(这一点回答的一般)8、HTTP响应码 500、501、502……  介绍一下,以及收到这些返回码如何排查问题9、HTTPS如何建立连接的,TLS的整个过程 ;HTTPS为什么要有不同版本的加密算法,这些不同版本的加密算法为了去解决什么问题(这点回答的一般)10、TCP的可靠性保证;拥塞控制详细介绍一下;11、TCP层和应用层用到的数据包是不一样的,可能应用层数据包有的时候比传输层包大,有的时候比更小。粘包和拆包的问题,如何解决12、网络忙时和闲时路由的选择是不一样的,路由选择协议。(说了几个路由选择协议的名字,具体原理有点忘了)
查看13道真题和解析
点赞 评论 收藏
分享
评论
43
220
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务